1

我想在 Windows 套接字中发送结构。我使用 TCP 协议。

例如我有这个结构:

typedef struct  headerLobby
{
    unsigned      nbGames;
}    head; 

我发送我的结构:

char buff[DEFAULT_BUFFER_LENGTH]; //DEFAULT_BUFFER_LENGTH = 512
headerLobby header;

header.nbGames = 1;
memcpy(buff, &header,  sizeof(headerLobby));
send(ClientSocket, buff, sizeof(headerLobby, 0);

我收到数据:

headerLobby header;

char recvbuf[DEFAULT_BUFFER_LENGTH];
memset(recvbuf, 0, DEFAULT_BUFFER_LENGTH);
int iResult = recv(ConnectSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);

memcpy(&header,recvbuf,  sizeof(headerLobby));

但是当我打印 header.nbrGames 时,我没有很好的价值。

客户端和服务器都在 windows 8 64 位和处理器 intel x64 中。我不明白我的代码有什么问题。

4

4 回答 4

1

您可以转储您尝试发送的十六进制数据并且您正在接收。使用wireshark/类似工具在发送/接收端进行数据包捕获,并查看您在网络上看到的数据包数据是您所期望的。

几个最佳实践,

  1. 始终将您的结构保持在对齐的大小。如有必要,在结构末尾使用填充。如果您不这样做,编译器将自动保持结构大小对齐,这将导致您在线发送的数据可能与您尝试发送的数据不匹配。

  2. 在通过网络发送任何内容之前,请按照网络字节顺序保存数据。您可以使用 htonl 进行转换。它可能不会在这里引起问题,因为拱门是相同的,并且您正在处理数据等。但这可能会导致可移植代码出现问题。

于 2013-11-09T01:55:50.360 回答
0
  (...)
  header.nbGames = 1;
  memcpy(buff, &header, sizeof(struct headerLobby));
  send(ClientSocket, buff, sizeof(struct headerLobby), 0);

  memset(recvbuf, 0, 20);
  int iResult = recv(ConnectSocket, recvbuf, 20, 0);
  memcpy(&recvheader, recvbuf, sizeof(struct headerLobby));

  printf("%d\n", recvheader.nbGames);
  (...)

$ ./出

1

所以,它有效。你的代码是正确的。或者您显然对其进行了编辑以将其粘贴到此处,从而删除了有问题的部分。提示:总是创建一个最小的测试用例来证明或反驳你的问题。

于 2013-11-09T03:25:14.923 回答
0

我发现了我的错误。示例代码有效,但我的错误是我想发送几个结构。当我发送结构时,我没有将指针发送到第一个结构。

例如 :

char buff[DEFAULT_BUFFER_LENGTH]; //DEFAULT_BUFFER_LENGTH = 512
headerLobby header;
GameInfo info; //other struct

header.nbGames = 1;
info.nbPlayers = 3;
memcpy(buff, &header,  sizeof(headerLobby));
buf += sizeof(headerLobby);
memcpy(buf, &info, sizeof(gameInfo));
send(ClientSocket, buff, sizeof(headerLobby, 0); //I lost the pointeur to the first struct
于 2013-11-09T12:24:47.260 回答
-1

尽管可以安全地完成,但通过套接字(或为此使用任何二进制方法)发送结构数据是有风险的,原因有几个。

内在类型的大小可能因机器而异。
发送机器上的填充在接收机器上可能不同。
发送机器上的字节序规则可能与接收机器上的不同。

通常从一开始就以这种方式发送结构数据不是一个好主意,但需要注意的是

如果您首先将数据序列化到缓冲区中(归功于这篇文章),这些问题就会得到解决。

于 2013-11-09T03:10:13.507 回答