通过套接字发送整数和字符

时间:2014-03-21 08:03:06

标签: c sockets

我正在使用套接字为应用程序编写代码,我必须通过网络发送整数和字符串,但是我无法将数据打包到缓冲区进行传输。我试过这样做:

sendline[0] = htons(3);
sendline[1] = htons(strlen(argv[3]));
for(int i = 0; i < strlen(argv[3]); i++)
{
    sendline[i + 2] = argv[3][i];
}
sendline[2 + strlen(argv[3])] = htons(atoi(argv[4]));
sendline[3 + strlen(argv[3])] = '\0';

但它不起作用。 我在哪里错了?此外,序列化此类数据的最佳方法是什么?

这是我的反序列化代码:

case '3': // switching on the value of buf[0]
{
    int i;
    int len = ntohs(buf[1]);
    char* ch = (char*)malloc(len * sizeof(char));
    for(i = 0; i < len; i++)
    {
        ch[i] = buf[i + 2];
    }
}

2 个答案:

答案 0 :(得分:0)

如果要序列化32位(4字节)整数,则应该使用htonl()ntohl()

发送:

int my_integer = INT32_MAX;
uint32_t data = htonl(my_integer);
write(s, &data, sizeof(data));

的recv:

uint32_t data;
read(s, &data, sizeof(data));
int my_integer = ntohl(data);

有很多关于SO的问题已经描述了序列化和htonl() / ntohl()函数,但要注意那些省略了endianess的问题。请务必检查read()write()的返回值。

对于“字符串”,如果它们是描述ASCII文本的char数据,则不要序列化它们。 UTF8也可以在没有序列化的情况下工作,但要注意UTF-16。早期掌握endianess的重要一点是它指的是字节顺序而不是字节内的位顺序。 IIRC C保证单个字节的表示形式,因此在所有C平台上看起来都是一样的。

答案 1 :(得分:-1)

通过套接字发送/接收的缓冲区由char组成,1 byte long。 Integer / uint16_t类型为longer

那么当你尝试分配时,你真正做了什么?

sendline[0] = htons(3);

sendline[0]长度为1个字节,但htons(3)长度为2个字节,因此您将其截断。同样,您可以使用sendline[1]

sendline[1] = htons(strlen(argv[3]));

显然你的缓冲区已损坏。

在一个套接字中发送整数,在其他套接字中发送字符串,将整数转换为字符串或不覆盖缓冲区(因此必须在某些地方使用sizeof(int)