Posix C 非阻塞读套接字
Posix C non blocking read socket
我正在尝试创建线程来读取套接字描述符。需要使用非阻塞循环来检查当前时间并在会话结束后关闭套接字,但是 FD_ISSET
returns 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);
}
我哪里弄错了?
如果套接字为 4,则需要 select
查找至少五个可能的套接字,0、1、2、3 或 4。因此 select
的第一个参数是一个太少了。
您应该传递最高文件描述符值 + 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))
我正在尝试创建线程来读取套接字描述符。需要使用非阻塞循环来检查当前时间并在会话结束后关闭套接字,但是 FD_ISSET
returns 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);
}
我哪里弄错了?
如果套接字为 4,则需要 select
查找至少五个可能的套接字,0、1、2、3 或 4。因此 select
的第一个参数是一个太少了。
您应该传递最高文件描述符值 + 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))