【问题标题】:Negative Numbers over TCP socket CTCP 套接字 C 上的负数
【发布时间】:2012-12-22 19:07:29
【问题描述】:

每当我尝试通过 TCP 套接字发送负数时,当我打印收到的内容时,它会显示“4.29497e+09”。我正在做的就是:

int i = -8;
int temp = htonl(i);
write(sock,&temp,4);

在服务器上:

int temp;
read(sock, &temp,4);
int read = ntohl(temp);
cout << read << endl;

如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • 您在read()之后忘记从网络订单转换为主机订单
  • 您对 int 的大小做了一些假设。
  • 你忘了检查read的返回值!如果是3呢?另外,不要给变量和函数同名,那只是自找麻烦。你应该使用正确的类型(uint32_t)和htonl/ntohl
  • @tpg2114:这不是强制性的,只要两个端点使用相同的架构
  • 即使假设您的架构的特定编译器总是具有 sizeof(int) == 4 也是错误的。另外,如果您稍后在移植应用程序时忘记了它,就不会出现错误 - 您只会得到一个错误的值并破坏超出的内存。

标签: c sockets tcp


【解决方案1】:

htonl/ntohl 函数专门用于无符号 32 位整数。

htonl() 函数将 无符号 整数 hostlong 从主机字节顺序转换为网络字节顺序。

【讨论】:

    【解决方案2】:

    通过套接字传输数据时,您无需将其转换为网络字节序。 此函数用于转换地址,而不是实际数据。这些函数适用于无符号整数,因此它们与您的参数(有符号整数)不匹配

    您需要省略它们。

    如果第二台机器使用不同的字节序,这种情况很少见(8086 和 ARM 架构都使用小字节序),则在读取整数和短字节时需要交换字节。 这通常在接收套接字上完成。

    【讨论】:

    • 我在代码中有这个,只是重新输入了所有内容。编辑反映了这一点。
    • 尝试发射 ntohl 和 htonl
    猜你喜欢
    • 2015-02-17
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多