在程序中,我需要通过TCP套接字发送一个整数值。我出于此目的使用send()
和recv()
函数,但它们仅以字符串形式发送和接收它。
send()
和recv()
是否有其他替代方法可以发送和接收整数值?
答案 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