在一个程序中,我需要通过 TCP 套接字发送一个整数值。我为此目的使用了send()
andrecv()
函数,但它们仅将其作为字符串发送和接收。
有没有其他替代方法来发送和接收整数值send()
?recv()
在一个程序中,我需要通过 TCP 套接字发送一个整数值。我为此目的使用了send()
andrecv()
函数,但它们仅将其作为字符串发送和接收。
有没有其他替代方法来发送和接收整数值send()
?recv()
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()
接收后(网络到主机,长),你会没事的。
当然,您可以将整数作为四个字节发送(或者您的整数恰好是多少字节);但你必须小心。看看htonl()
你的系统上可能出现的功能<arpa/inet.h>
。
假设一个四字节整数 n,这可能会做你想要的:
uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);
然后您可以在接收端对补码进行编码。
调用 to 的原因htonl()
是最高位字节通常首先通过 Internet 传输,而某些计算机体系结构(如无处不在的 x86)首先存储最低位字节。如果你不固定字节顺序,而一端的机器是x86,另一端的机器是别的机器,那么没有htonl()
整数就会出现乱码。
顺便说一句,我不是该主题的专家,但在没有专家答案的情况下,这个答案可能有用。祝你好运。
我也试过了。但是写不出来。所以我找到了另一个解决方案。
// 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