【发布时间】:2014-02-27 16:20:15
【问题描述】:
在我的简单 TCP 客户端服务器应用程序中,服务器重复向客户端发送 1 kB 消息,客户端为每个数据包发送回复确认(仅发送“ACK”)。试想一下这种情况就像客户端和服务器在无限循环中到处传递 1 kB 消息。
我每次发送相同的消息,第一个字节(第一个字符)始终为 1。但是在同一台机器上长时间测试这个客户端和服务器应用程序时,我注意到一些接收到的消息的第一个字符是接收缓冲区中的其他内容和recv 函数也返回了 1024 (1 kB)。这种情况并不经常发生。
这就是我收到的方式。
char recvBuff[DEFAULT_BUFFER_SIZE];
int iResult = SOCKET_ERROR;
iResult = recv(curSocket, recvBuff, DEFAULT_BUFFER_SIZE, 0);
if (iResult == SOCKET_ERROR)
{
return iResult;
}
if (recvBuff[0] != 1)
{
//malformed receive
}
MessageHeader *q = (MessageHeader*)recvBuff;
message.header = *q; q++;
std::string temp((char*)q, message.header.fragmentSize);
message.message = temp;
实际上问题在于构建临时字符串。由于未收到正确的片段大小,它会中断。我试图删除这些格式错误的数据。但问题是最后一次成功接收的分片 ID 和格式错误接收后第一次成功收到的分片 ID 之间存在差距。知道为什么会发生这些格式错误的接收吗?
【问题讨论】: