ESP 32 TCP连接被同级

时间:2018-12-03 11:04:23

标签: c++ sockets tcp esp32

我正在基于一个使用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;
}

1 个答案:

答案 0 :(得分:0)

您没有从TCP套接字正确读取。调用recv(buflen=X)可能返回0..X字节。 recv()不会等到整个缓冲区都填满数据。

通常recv()必须循环调用,直到收到足够的数据为止。每个TCP接收器(服务器或客户端)都必须这样做。没有办法解决这个问题。这就是TCP的工作方式。 TCP始终是面向字节的。没有数据包边界。查看每个recv()调用实际收到的字节数时,将观察到路径上使用的网络基础结构和缓冲区的各种工件。