无法读取从客户端发送的所有消息

Unable to read all messages sent from client

本文关键字:消息 读取 客户端      更新时间:2023-10-16

我想读取从客户端发送的所有消息。我正在实施一个 tcp 服务器,它接收数据。每条消息都附加消息的大小作为标头。所以现在我可以读取标头并从中找到大小,并为稍后读取的消息分配大量内存。然而,由于我很少接触C++这就是我想出的。

如何阅读所有消息?

 void *dothistask(void *socket_desc)
 {
   int sock = *(int*)socket_desc;
   free(socket_desc);
   int read_size;
   unsigned int x = 4;
   char *header = (char*)malloc(sizeof(char) * 4);
   char *message;
   int index = 0;
   long p;
   int status;
   while(true) {
     status = ReadXBytes(sock, 4, header);
     if(status == -1)
     {
        break;
     }
     message = (char *)malloc(sizeof(char) * 10);
     status = ReadXBytes(sock, 10, message);
     if(status == -1)
     {
        break;
     }
     cout<<"The header is "<<header<<endl;
     cout<<"The message is "<<message<<endl;
   }
  return 0;
 }
 int ReadXBytes(int socket, unsigned int x, void* buff)
 {
   char *buffer = (char*)buff;
   int bytesRead = 0;
   int result;
   while (bytesRead < x)
   {
     result = recv(socket, buffer + bytesRead, x - bytesRead, 0);
     if(result == 0)
     {
        cout<<"Client disconnected"<<endl;
        fflush(stdout);
        return -1;
     }
     else if( result == -1)
     {
        perror("recv failed");
        return -1;
     }
     bytesRead += result;
   }
   return 0;
 }
阅读,

最好先阅读标题,然后再阅读消息。我可以这样做一次,但我想在一段时间内重复执行此操作,基本上是永远这样做,直到客户端断开连接。

谢谢

!谢谢你的帮助!

要阅读该消息,您有

ReadXBytes(sock, 10, message);

但它应该是这样的

ReadXBytes(sock, *((int*)header), message);

取决于标题的内容。由于您有一个硬编码的10,因此您只会读取 10 个字节。您还必须相应地调整malloc,不仅要分配 10 个字节。