C++ TCP/IP发送Networkbyte的转换方式是否正确咨询
代码存在的问题及修正方案
你代码里的问题非常明确,逐条梳理如下:
- 数组越界问题(核心原因之一,导致你读到0值)
你定义的buffer_converted是长度为1的数组:int buffer_converted[1] = { 0 };,C/C++数组下标从0开始,你后续赋值buffer_converted[1] = { _wtoi(buffer) };、转换时取input[1]都属于越界访问,读取到的是未知内存值,大概率就是0。 - send函数参数传值错误(核心原因,直接导致发送无效)
send的第二个参数要求是待发送数据的内存地址,你写的(char*)networkbyte、(char*)userInput_converted都是把变量本身的值强制转成了地址,相当于把你要发的数值当成了内存地址去读,自然读不到正确的发送内容。正确写法要加取地址符&:// 正确写法示例 int sendResult = send(sock, (char*)&networkbyte, sizeof(networkbyte), 0); - 类型不匹配问题
htons是专门用于将16位无符号整数从主机序转网络序的函数,你用它转32位int类型,还把结果存到uint64_t类型的userInput_converted里,类型完全混乱。如果你的业务只需要传16位数值,全程统一用uint16_t类型即可:uint16_t userInput_converted = htons((uint16_t)userInput); int sendResult = send(sock, (char*)&userInput_converted, sizeof(userInput_converted), 0); - 无效判断逻辑
你写的if (sizeof(userInput) > 0 && a == false)完全没用,userInput是int类型参数,sizeof(int)在Windows平台固定为4,这个判断永远成立,没有实际校验作用。 - 全局变量滥用问题
你把networkbyte、buffer之类的变量定义成全局变量,不仅容易出冲突,也不利于代码维护,建议放到对应函数内部定义。
内容的提问来源于stack exchange,提问作者Hatux
相关产品推荐
相关产品推荐

