POSIX C 非阻塞读取套接字

问题描述 投票:0回答:2

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

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);
}

我哪里做错了?

c sockets posix posix-select
2个回答
5
投票

您应该传递最高的文件描述符值+ 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))

1
投票

如果套接字是 4,则需要

select
查找至少 5 个可能的套接字,0、1、2、3 或 4。因此,
select
的第一个参数太少了。

© www.soinside.com 2019 - 2024. All rights reserved.