c - Posix C 非阻塞读套接字

标签 c sockets select posix

我正在尝试创建线程来读取套接字描述符。需要使用非阻塞循环执行此操作以检查当前时间并在 session 结束后关闭套接字,但即使套接字可以读取数据,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);
}

我哪里做错了?

最佳答案

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

关于c - Posix C 非阻塞读套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803240/

相关文章:

c# - 如何将 2D int 数组从 C 代码返回到 C#?

C - 使用用户输入文件名

ios - 如何让联网的软件意识到自己?

mysql - 在MySQL中选择查询多个表

javascript - 使用 Javascript 获取选择输入并在另一部分使用数据

mysql - 如何在 MYSQL 中比较 YEAR 类型?

c - 函数在 C 中分配不正确的浮点值

node.js - 在 Node js 应用程序中使用 cluster js 时,socketcluster 是否多余?

java - InputStream 跳过字节

c - 在c中传递引用?