我正在基于一个使用3个嗅探PROBE数据包的ESP32板跟踪运动的项目。依次为每个ESP调用此函数。因此,首先我连接所有ESP,然后调用此函数,并开始从连接中读取数据包的数量,然后读取每个数据包。问题是,当我尝试从每个ESP发送200个数据包的列表时,服务器正确接收了第一个ESP的数据包数量,但随后开始读取这些数据包并仅接收其中一部分(正确接收了200个数据包中的140个)总数,然后是包141的一部分),然后崩溃。板卡能够发送所有数据包,但由于服务器崩溃,因此不会从服务器收到任何ACK。我不明白为什么在测试大量数据包时服务器总是崩溃,而在单板和少量数据包下却能正常工作
int recvPseq(SOCKET s) {
uint32_t numP;
unsigned char netP[4];
int res;
res = recv(s, (char *)netP, 4, 0);
if (res > 0) {
if (res != 4) {
cout << "Number of packet not entirely received! Only: " << res << " bytes" << endl;
return 0;
}
}
else if (res == 0) {
cout << "Socket closed by the client" << endl;
return 0;
}
else {
cout << "Error while receving the number of packets: " << WSAGetLastError() << endl;
return 0;
}
/* NumP contains the number of packets */
numP = ntohl(*(uint32_t*)netP);
cout << "Number of packets: " << numP << endl;
/* Reading the packets */
for (int i = 0; i < numP; i++) {
unsigned char recvbuffer[55];
res = recv(s, (char *)recvbuffer, 55, 0);
if (res > 0) {
if (res != 55) {
cout << "Packet " << i + 1 << " not entirely received! Only: " << res << " bytes" << endl;
return 0;
}
}
else if (res == 0) {
cout << "Socket closed by the client" << endl;
return 0;
}
else {
cout << "Error while receving the number of packets: " << WSAGetLastError() << endl;
return 0;
}
cout << "Received " << i + 1 << endl;
}
return 1;
}
答案 0 :(得分:0)
您没有从TCP套接字正确读取。调用recv(buflen=X)
可能返回0..X字节。 recv()
不会等到整个缓冲区都填满数据。
通常recv()
必须循环调用,直到收到足够的数据为止。每个TCP接收器(服务器或客户端)都必须这样做。没有办法解决这个问题。这就是TCP的工作方式。 TCP始终是面向字节的。没有数据包边界。查看每个recv()
调用实际收到的字节数时,将观察到路径上使用的网络基础结构和缓冲区的各种工件。