c++ - 从套接字卡住中读取

标签 c++ c sockets

我在从服务器上的客户端读取数据时遇到问题。读取所有数据后,read() 函数将始终卡住(阻塞)并等待更多数据,这对我来说是不受欢迎的。

服务器程序:

   soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
   struct sockaddr_in sin;  
   sin.sin_family = AF_INET;  
   sin.sin_port = htons(port);   
   sin.sin_addr.s_addr = INADDR_ANY; 
   bind(soc, (struct sockaddr*) &sin, sizeof(sin));

   if (listen(soc, MAX))
      return;

   int socc;               // socket for clinet     
   while (1) {
      if ((socc = accept(soc, (struct sockaddr *) &sin, sinlen)) < 0)
         break;
      while ((result = read(socc, pointer, SIZE)) > 0) {
         // after the data are readed, read function will block
      }
      // do some stuff and write reply to client => will never done
   }

客户端程序:

   ...
   soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)  
   struct sockaddr_in socketAddr;
   socketAddr.sin_family = AF_INET;
   socketAddr.sin_port = htons(port);
   memcpy(&(socketAddr.sin_addr), host->h_addr, host->h_length);
   if (connect(soc, (sockaddr *)&socketAddr, sizeof(socketAddr)) == -1)  
      return;
   if (write(soc, req.c_str(), strlen(req.c_str())) < 0)
      return;

主要问题是我不知道客户端将向服务器发送多少数据,所以服务器应该从套接字读取所有数据,在没有任何数据后,离开读取周期。但是服务器读取了整个消息(例如 30 字节)并等待更多(但没有更多)。套接字仍处于打开状态,因为客户端正在等待服务器的回复。

最佳答案

您需要使您的套接字成为非阻塞的。在这种情况下,如果没有任何内容可读取并出现特定错误,读取将立即退出。

C- Unix Sockets - Non-blocking read

关于c++ - 从套接字卡住中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319267/

相关文章:

android - 如何在 Android 的 native 代码中获取基于网络的位置?

c - 为什么 scanf 在这里跳过输入?

Java客户端-服务器问题

c++ - 已修复 : C++ server/client program: "Connection refused"

c++ - 调用父类(super class)构造函数的规则是什么?

C++ 常量赋值

c - 条件赋值的简写方式

c++ - 拖动 View 时 QGraphicsItem 消失

c++ - 如何在 C++ 正则表达式中使用 Unicode 范围

java - 套接字异常 : Connection reset after reconnect