【问题标题】:Posix C non blocking read socketPosix C 非阻塞读套接字
【发布时间】:2015-01-06 16:46:29
【问题描述】:

我正在尝试创建线程以从套接字描述符中读取。需要使用非阻塞循环来检查当前时间并在会话结束后关闭套接字,但FD_ISSET 即使在套接字上可以读取数据也会返回 0。

fd_set fds;
FD_ZERO(&fds);
FD_SET(session_ref->fd, &fds);

while(1)
{
    while(1)
    {
        FD_CLR(session_ref->fd, &fds);
        FD_SET(session_ref->fd, &fds);
        n = select( session_ref->fd, &fds, NULL, NULL, &timeout ); // n = 0 
        if( FD_ISSET( session_ref->fd, &fds ) )
            break;
        else 
        {
            // some operations
        }
        sleep(1);
    }
    n = read( session_ref->fd, buffer, 2048 );
    printf("Read: %i\n", n);
}

我哪里做错了?

【问题讨论】:

  • 你没有检查n == 1
  • 但n也等于0
  • 您在select() 的第一个参数中传递了fd。您需要通过 fd+1 代替。阅读文档。

标签: c sockets select posix


【解决方案1】:

你应该传递最高的文件描述符值 + 1,这就是为什么n == 0

n = select( session_ref->fd, &fds, NULL, NULL, &timeout ); // n = 0 

必须是

n = select( 1 + session_ref->fd, &fds, NULL, NULL, &timeout ); // n = 0 

然后检查集合中有多少文件准备好了

if ((n > 1) && (FD_ISSET( session_ref->fd, &fds ) != 0))

在你的情况下,由于集合中只有一个文件,它实际上是

if ((n == 1) && (FD_ISSET( session_ref->fd, &fds ) != 0))

【讨论】:

    【解决方案2】:

    如果套接字为 4,则需要 select 来查找至少五个可能的套接字,0、1、2、3 或 4。因此,select 的第一个参数太少了。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      相关资源
      最近更新 更多