在C中通过TCP发送和接收整数值

Jam*_*Joy 4 c sockets network-programming tcp

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

是否有任何替代方案send(),recv()以便发送和接收整数值?

sar*_*old 9

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()接收(网络到主机,长)之前坚持使用,您就可以了.


thb*_*thb 5

当然,您可以将整数作为四个字节发送(或者您的整数恰好是多少字节);但你必须小心。查看该功能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()整数就会出现乱码。

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