c++ - 无法读取客户端发送的所有消息

标签 c++ sockets tcp network-programming

我想阅读从客户端发送的所有消息。 我正在实现一个 tcp 服务器并接收数据。每条消息都附加了消息的大小作为标题。所以现在我可以读取 header 并从中找到大小并为稍后读取的消息分配那么多内存。然而,由于我很少接触 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 个字节。

关于c++ - 无法读取客户端发送的所有消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856936/

相关文章:

php - 当服务器未指定文件末尾时,读取到XML响应的末尾?

c# - C# 中的 WebRequest/WebResponse 阻塞

java - 我的应用程序卡在 mBufferIn.readLine() 上

c++ - 从数组中添加值并插入空间

c++ - 无法通过 CreateProcess API 打开 chrome 浏览器

c++ - 编译时如何选择方法?

node.js - Socket.io 未保存在 Mongoose save() 上

c - 1 台计算机,2 个程序,2 个 NIC 在 2 个不同的子网上,打开套接字/绑定(bind)端口在两个程序之间发生冲突,为什么?

java - Java 中的非阻塞套接字写入与阻塞套接字写入

c++ - 求解 A xor X = B + X 的算法