gpt4 book ai didi

c++ - 服务器未在 C++ 套接字中接收到尾随 long

转载 作者:行者123 更新时间:2023-11-28 02:41:32 25 4
gpt4 key购买 nike

我正在使用 C++ 通过套接字传输结构。我阅读了一些关于发送结构的早期问题,建议的一种方法是在转换后使用 char* 进行传输。由于服务器和客户端都在同一台机器上,所以这里没有字节序问题。

这里有几个问题。我得到的结构大小为 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 序列化发送结构的信息,但与此同时,对于简单结构来说,开销是巨大的。

最佳答案

您几乎肯定会收到所有数据。问题在于这一行:

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";

显示您收到的包裹的所有字节。

关于c++ - 服务器未在 C++ 套接字中接收到尾随 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25820891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com