2014-09-13 59 views
0

我正在使用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序列化发送结构的问题,但同时对于简单结构来说开销很大。

+1

'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

+1

还请注意,您的字符串字段对于要复制到的字符串太小 - 显然,您不允许使用\ 0终止符。将来使用strcpy可以避免你犯这种错误时的内存损坏。 – 2014-09-13 07:44:04

+0

@PaulR,\ 0是否必要?我只使用'strcpy'?不明白你的意思。 – 2014-09-13 07:54:58

回答

2

你几乎肯定会收到所有的数据。问题是与这一行:

cout << "|" << incomming_data_buffer << "|\n"; 

它打印incomming_data_buffer为C风格字符串,所以停止在第一零字节。由于您的long值以二进制编码,因此至少会有零(在字段之间填充的位置可能有零)。

你可以尝试做这样的事情:

cout << "|"; 
for (int i = 0; i < bytes_received; i++) 
{ 
    cout << hex << (((int)incomming_data_buffer[i]) & 0xff) << " "; 
} 
cout << "|\n"; 

显示你收到的包的所有字节。

+0

我试过这个,但是得到一些奇怪的cout错误,对于运算符<<' – 2014-09-13 11:41:35

+0

,类型为int和char [2]的无效操作数需要围绕数学表达式的另一组括号以及&0xff。现在编辑。 – 2014-09-13 17:25:26

+0

我看到所有收到的字节,但我认为服务器想要很长时间立即开始发布第三个字段。有没有办法实现这一点,并避免填充? – 2014-09-14 06:59:11

相关问题