4

在一个程序中,我需要通过 TCP 套接字发送一个整数值。我为此目的使用了send()andrecv()函数,但它们仅将其作为字符串发送和接收。

有没有其他替代方法来发送和接收整数值send()recv()

4

3 回答 3

9

send()并且recv()不要发送字符串。他们发送字节。由您来提供有意义的字节解释。

如果您希望发送整数,您需要确定要发送的整数大小——1 字节、2 字节、4 字节、8 字节等。您还需要确定编码格式“网络顺序”描述了 Big-Endian 格式的约定。<arpa/inet.h>您可以使用 from或的以下函数转换为网络订单和从网络订单转换<netinet/in.h>

   uint32_t htonl(uint32_t hostlong);
   uint16_t htons(uint16_t hostshort);
   uint32_t ntohl(uint32_t netlong);
   uint16_t ntohs(uint16_t netshort);

如果你坚持htonl()在发送前(主机到网络,长)和ntohl()接收后(网络到主机,长),你会没事的。

于 2012-06-21T22:26:47.823 回答
5

当然,您可以将整数作为四个字节发送(或者您的整数恰好是多少字节);但你必须小心。看看htonl()你的系统上可能出现的功能<arpa/inet.h>

假设一个四字节整数 n,这可能会做你想要的:

uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);

然后您可以在接收端对补码进行编码。

调用 to 的原因htonl()是最高位字节通常首先通过 Internet 传输,而某些计算机体系结构(如无处不在的 x86)首先存储最低位字节。如果你不固定字节顺序,而一端的机器是x86,另一端的机器是别的机器,那么没有htonl()整数就会出现乱码。

顺便说一句,我不是该主题的专家,但在没有专家答案的情况下,这个答案可能有用。祝你好运。

于 2012-06-21T22:25:54.377 回答
4

我也试过了。但是写不出来。所以我找到了另一个解决方案。

// send
char integer[4];                  // buffer
*((int*)integer) = 73232;         // 73232 is data which I want to send.
send( cs, integer, 4, 0 );        // send it

// receive
char integer[4];                  // buffer
recv( s, integer, 4, 0 );         // receive it
于 2013-06-28T21:08:23.127 回答