我正在使用C++在套接字上传递一个结构。我阅读了一些关于发送结构的问题,并且建议在转换后使用char *进行转移。由于服务器和客户端都在同一台机器上,所以在这里没有排序问题。服务器没有收到C++套接字中的尾部长整数
几个问题在这里。我把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 [因为对齐](http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of -的-各部件-sizeof)。 'long'必须在'sizeof(long)'边界上对齐,这在你的机器上显然是8个字节。另一方面,字符只需要对齐1个字节。前四个成员有27个字节,因此编译器必须在'field3'和'long'之间添加额外的填充(5个字节)以便对齐工作。因此27 + 5字节= 32字节,为两个“长”提供了适当的对齐方式(并解释了5字节的差异)。 – 2014-09-13 07:35:09
还请注意,您的字符串字段对于要复制到的字符串太小 - 显然,您不允许使用\ 0终止符。将来使用strcpy可以避免你犯这种错误时的内存损坏。 – 2014-09-13 07:44:04
@PaulR,\ 0是否必要?我只使用'strcpy'?不明白你的意思。 – 2014-09-13 07:54:58