无法读取客户端发送的所有邮件

时间:2016-04-26 06:31:28

标签: c++ sockets tcp network-programming

我想阅读从客户端发送的所有邮件。 我正在实现一个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;
 }

请注意,首先读取标题然后阅读消息是理想的。我能够这样做一次,但我想在一段时间内完成这项工作,基本上是永远,直到客户断开连接。

谢谢!寻求帮助!

1 个答案:

答案 0 :(得分:1)

要阅读邮件,您有

ReadXBytes(sock, 10, message);

但它应该像

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

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