Jam*_*Joy 4 c sockets network-programming tcp
在程序中,我需要通过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);
Run Code Online (Sandbox Code Playgroud)
如果您htonl()
在发送(主机到网络,长)和ntohl()
接收(网络到主机,长)之前坚持使用,您就可以了.
当然,您可以将整数作为四个字节发送(或者您的整数恰好是多少字节);但你必须小心。查看该功能htonl()
,可能在您的系统上出现<arpa/inet.h>
。
假设一个四字节整数 n,这可能会做你想要的:
uint32_t un = htonl(n);
send(sockfd, &un, sizeof(uint32_t), flags);
Run Code Online (Sandbox Code Playgroud)
然后您可以在接收端对补码进行编码。
调用 的原因htonl()
是最高位字节通常首先通过 Internet 传输,而某些计算机体系结构(如无处不在的 x86)首先存储最低位字节。如果不固定字节顺序,一端的机器是x86,另一端的机器是别的东西,那么没有htonl()
整数就会出现乱码。
顺便说一句,我不是该主题的专家,但在没有专家答案的情况下,这个答案可能有用。祝你好运。