【发布时间】:2014-09-14 01:24:49
【问题描述】:
我正在使用 c++ 通过套接字传输结构。我阅读了一些关于发送结构的早期问题,建议的一种方法是在转换后使用 char* 进行传输。由于服务器和客户端都在同一台机器上,所以这里没有字节序问题。
这里有几个问题。我得到 struct 的大小为 48。根据我的计算,它不应该是 43 吗? 8x4 + 10 +1
其次,在服务器端,当我打印接收到的缓冲区时,我只得到文本元素。不接收长整数。
struct testStruct{
char type;
char field1[10];
char field2[8];
char field3[8];
long num1, num2;
};
testStruct ls;
ls.type = 'U';
strcpy(ls.field1, "NAVEENSHAR");
strcpy(ls.field2, "abcd1234");
strcpy(ls.field3, "al345678");
ls.num1 = 40;
ls.num2 = 200;
char* bytes = static_cast<char*>(static_cast<void*>(&ls));
bytes_sent = send(socketfd, bytes, sizeof(ls), 0);
cout << "bytes sent: " << bytes_sent<< "\n";
//On server sidechar
incomming_data_buffer[1000];
bytes_recieved = recv(new_sd, incomming_data_buffer,1000, 0);
cout << "|" << incomming_data_buffer << "|\n";
它显示接收到的 48 个字节并且没有我添加的尾随整数。 关于为什么会发生这种情况的任何想法。我读过关于使用 boost 序列化发送结构的文章,但同时对于简单结构来说开销很大。
【问题讨论】:
-
sizeof(testStruct)是 48 because of alignment。longs 必须在sizeof(long)边界上对齐,这在您的机器上显然是 8 个字节。另一方面,chars 只需要对齐 1 个字节。前四个成员有 27 个字节,因此编译器必须在field3和long之间添加额外的填充(5 个字节)才能使对齐工作。所以 27+5 字节 = 32 字节,为两个longs 提供了正确的对齐方式(并解释了 5 字节的差异)。 -
另请注意,您的字符串字段对于您要复制到它们的字符串来说太小了 - 显然您不允许使用 \0 终止符。以后再使用 strcpy 来避免出现这种错误时内存损坏。
-
@PaulR,是否需要 \0?我只使用
strcpy?没明白你的意思。 -
C 字符串总是有一个终止符 \0,例如“abcd1234”实际上是9个字符,所有这些都将被strcpy复制,因此写在你的8个字符串
field2的末尾。 -
@PaulR,谢谢,我改成了 memcpy。应该这样做。