指针强制转换and字节序导致的问题

       在C语言开发的过程中,发现不同硬件平台出现了一定差异性,例如在x86_64运行正常,二在xlp运行失败,分析如下。
       x86_64是小端序,而xlp是大端序。
       排查代码的时候,发现在相应申请内存的地方出现了强制转换。
       简化原来的代码如下:

DWORD FUNC_A(ULONG *pulMemSize)
{
    dwRet = FUNC_B ( (DWORD *)pulMemSize);
    return 0;
}

       其中DWORD为宏定义的unsigned int,而ULONG为unsigned long。由于FUNC_B为一个静态库提供的接口,同时入参为DWORD类型的指针。因此在这个地方进行了强制的转换。因为从ULOGN指针转换为DWORD指针,因此转换之后的DWORD指针的范围为pulMemSize这个指针所指向内存地址的前四个字节。
       来看一下变量内容是如何存储的。
       在小端序的系统(x86_64)中,如果*pulMemSize = ABCDEFGH,那么内存的存储顺序为HGFEDCBA(低地址存储变量低位),因此在进行指针转换的时候DWORD指针取值为HGFE,也就是说在 FUNC_B中对pulMemSize所指变量的操作是基于HGFE所在的内存空间,而由于HGFE所在的内存空间在小端序的系统中所表示的恰恰也是pulMemSize所指向变量的低位部分,因此这样操作是没有问题的(前提是取值没有超过32位大小)。
       但是在大端序的系统中,pulMemSize所指向变量的存储顺序为ABCDEFGH,而FUNC_B对pulMemSize所指变量的操作则是基于ABCD所在的内存空间,但是ABCD所表示的是pulMemSize所指向变量的高位部分。因此最后在以ULONG来取pulMemSize表示的内存值的时候,则会出错。
更新之后的代码为:

DWORD FUNC_A(ULONG *pulMemSize)
{
    DWORD dwMemSize = 0;
    dwRet = FUNC_B ( &dwMemSize);
    *pulMemSize = (ULONG)dwMemSize;
    return 0;
}

       可以看出这个dwMemSize这个中间临时变量作用大大的,因此以后如果见到这种看似没有的中间变量,不要轻易删除。
       其实这个问题说明的一个问题是,正常变量的强制转换。不同的硬件平台会自动的补齐或者截断对应的高位数据,但是对于指针的操作,由于指针总是从变量起始的位置开始寻址,因此要千万注意指针的强制转换。在不同的硬件系统可能会产生差异性。
       本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

### 本地主机通过 `localhost` 可访问但通过 IP可访问解决方案 当在 IIS 上发布网站时,如果发现能够通过 `localhost` 正常访问,但在绑定本机 IP 后无法访问,则可能是由于以下几个方面的原因: #### 1. **防火墙规则未正确配置** 如果绑定了 IP 地址后仍然无法访问,很可能是 HTTP 协议的默认端口(通常是 80 或者自定义端口)被防火墙阻止。此时需要确保 Windows 防火墙或其他安全软件允许外部流量进入指定端口。 具体操作如下: - 打开控制面板中的 Windows 防火墙设置。 - 进入高级设置并创建新的入站规则。 - 选择“端口”,指定 TCP 并填写目标端口号(如 80),然后允许连接[^1]。 #### 2. **应用程序仅绑定到回环地址 (`127.0.0.1`)** 若程序或服务仅仅绑定到了 `127.0.0.1` 而非 `0.0.0.0`,则其只会响应来自同一台机器上的请求。这可能导致即使设置了正确的 IP 和端口,在远程或者局域网环境下也无法访问。 修改方法取决于具体使用的框架和服务: - 对于 ASP.NET Core 应用,可以在启动参数中加入 `--urls=http://0.0.0.0:<port>` 来让应用监听所有网络接口上的请求[^2]。 - 在 IIS 中部署的应用需检查站点绑定设置是否包含了所需的公网/私网 IP 地址及其对应端口[^4]。 #### 3. **IP 地址冲突或错误** 确认所使用的本机 IP 是否有效且无误非常重要。有时可能会因为 DHCP 分配不当或者其他网络组件干扰而导致实际可用的 IP 发生变化。建议利用命令行工具验证: ```bash ipconfig /all ``` 此外还可以尝试 ping 自己的计算机或静态分配给它的固定 IP 地址以进一步诊断连通性状况。 #### 4. **DNS 解析问题** 当存在多个 NIC (Network Interface Card) 设备时,某些情况下操作系统会选择优先级较高的适配器来进行域解析过程。因此尽管手动指定了某个特定 IP 地址作为入口点,但由于 DNS 缓存等原因最终仍指向了另一个地方造成失败现象发生。清除本地缓存可以帮助缓解此类情况: ```cmd ipconfig /flushdns ``` --- ### 示例代码调整 Web Server 监听范围至全局网络接口 对于基于 Node.js 构建的服务来说,可以通过更改 server.listen() 函数调用来支持更广泛的客户端接入需求: ```javascript const http = require('http'); // 将 '127.0.0.1' 替换为 '0.0.0.0' const server = http.createServer((req, res) => { res.end('Hello World'); }); server.listen(3000, '0.0.0.0', () => { console.log(`Server running at http://0.0.0.0:3000`); }); ``` 上述脚本使得节点实例不仅限于处理源自 localhost 的事务,而是开放给了整个子网内的潜在访客群体。 --- ### 总结 综合以上分析可知,针对 “localhost 可访问IP可访问”的常见解决办法包括但不限于重新审视防火墙策略、修正服务器绑定行为以及排除底层硬件层面上存在的隐患因素等几个维度展开深入探讨与实施改进措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值