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

时间:2012-06-21 22:20:40

标签: c sockets tcp network-programming

在程序中,我需要通过TCP套接字发送一个整数值。我出于此目的使用send()recv()函数,但它们仅以字符串形式发送和接收它。

send()recv()是否有其他替代方法可以发送和接收整数值?

3 个答案:

答案 0 :(得分:9)

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

如果你想发送整数,你需要决定你要发送的整数大小 - 1字节,2字节,4字节,8字节等。你还需要决定encoding format"Network order"描述了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);

如果您在接收(网络到主机,长)之后发送(主机到网络,长)和htonl()之前坚持使用ntohl(),那么您就可以了。

答案 1 :(得分:4)

当然,您可以将整数作为四个字节发送(或者整数恰好是多少字节);但你必须要小心。请参阅系统中显示的函数htonl(),可能在<arpa/inet.h>

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

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

然后你可以在接收端编写补码。

调用htonl()的原因是,最高位字节通常首先通过Internet传输,而某些计算机架构(如无处不在的x86)首先存储最低位字节。如果你不修复字节顺序,并且一端的机器是x86,而另一端的机器是其他的,那么没有htonl()整数将会出现乱码。

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

答案 2 :(得分: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