[英]Send and receive an integer value over TCP in C
在程序中,我需要通过TCP套接字发送一个整数值。 我为此目的使用了send()
和recv()
函数,但它们只是以字符串形式发送和接收它。
send()
和recv()
有什么替代方法可以发送和接收整数值吗?
send()
和recv()
不发送字符串。 他们发送字节 。 您需要提供有意义的字节解释。
如果您希望发送整数,则需要确定要发送的整数大小 - 1字节,2字节,4字节,8字节等。您还需要确定编码格式 。 “网络顺序”描述了Big-Endian格式的约定。 您可以使用<arpa/inet.h>
或<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);
如果您在接收(网络到主机,长)之后发送(主机到网络,长)和ntohl()
htonl()
之前坚持使用htonl()
),那么你就可以了。
当然,您可以将整数作为四个字节发送(或者整数恰好是多少字节); 但你必须要小心。 请参阅系统中提供的函数htonl()
,可能在<arpa/inet.h>
。
假设一个四字节整数n,这可能会做你想要的:
uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);
然后你可以在接收端编码补码。
调用htonl()
的原因是,最高位字节通常首先通过Internet传输,而某些计算机体系结构(如无处不在的x86)首先存储最低位字节。 如果你不修复字节顺序,并且一端的机器是x86,而另一端的机器是其他的,那么没有htonl()
,整数将通过乱码。
我不是在主题的专家,顺便提一句,但在没有experter答案,这个答案或许可以。 祝好运。
我也试过了。 但写不起作用。 所以我找到了另一个解决方
// 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.