【问题标题】:Trying to read from socket but it blocks the while loop试图从套接字读取,但它阻塞了 while 循环
【发布时间】:2019-12-07 04:02:37
【问题描述】:

我想构建一个 while 循环,无论是否发送了消息,它都可以从非阻塞套接字连续读取。我使用 read 函数从套接字读取,但是当它到达 read() 时,while 循环被阻塞。我还需要使读取成为非阻塞吗?

while(1){

  char client_response[256];
  client_response = (char*) malloc(256);

  int reader = read(socket_fd, server_response, sizeof(server_response));
  printf("passed reader\n");   // this never shows
  if(reader < 0){
     perror("read fails\n");
     return -1;
  }
  sleep(1);
}

【问题讨论】:

  • 你搜索了吗?例如:thisthis 有帮助吗?
  • 哪个操作系统?它有所作为。
  • 我很难相信您将从malloc 返回的指针分配给一个固定大小的数组不会导致编译错误。
  • 你能告诉我们设置套接字非阻塞的代码吗?

标签: c


【解决方案1】:

我不确定您是如何将套接字配置为非阻塞的。但是 Windows 和 Unix 的步骤不同。如果你能告诉我操作系统,我可以提供更多关于非阻塞套接字配置的细节。

下面是一种更加平台中立的方式,以非阻塞方式轮询套接字,而无需显式将套接字配置为非阻塞。使用MSG_DONTWAIT 标志(如果可用)或MSG_PEEK 标志作为提示来查看是否可以进行调用。

另外,我们只使用recv 而不是read,因为这是一个套接字。

 #ifdef MSG_DONTWAIT
    int reader = recv(socket_fd, server_response, sizeof(server_response), MSG_DONTWAIT);
#else
    int reader = recv(socket_fd, server_response, sizeof(server_response), MSG_PEEK);
    if (reader > 0)
    {
        reader = recv(socket_fd, server_response, sizeof(server_response), 0);
    }
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2011-10-30
    • 2012-07-24
    • 2011-12-27
    • 1970-01-01
    • 2014-12-31
    • 2016-04-11
    • 2015-08-28
    相关资源
    最近更新 更多