【发布时间】:2015-12-19 02:46:05
【问题描述】:
我正试图在套接字上调用select,但我不明白我做错了什么。
setup_server_socket 调用 bind 和 listen 并将套接字设置为非阻塞模式。
select 调用上的以下代码块似乎没有前进到FD_ISSET。我尝试连接客户端,似乎成功了,但 select 从未返回任何内容。
这样做的正确方法是什么?
...
int listenfd = setup_server_socket( serverPort );
if( -1 == listenfd )
return 1;
fd_set read_fds;
FD_ZERO(&read_fds);
int fdmax = listenfd;
// loop forever
while( 1 )
{
if (select(fdmax+1, &read_fds, NULL,NULL,NULL) == -1){
perror("select");
exit(4);
}
for (int i = 0; i<= fdmax; i++){
printf("Testing: %d, %d\n", i, FD_ISSET(i,&read_fds));
}return 0;
...
【问题讨论】:
-
来自精美手册:
... If time‐ out is NULL (no timeout), select() can block indefinitely. ...BTW:从 select() 返回 -1 不是错误 -
当然,但仅仅因为它可以并不意味着它应该......我遇到的问题是 FD_ISSET 从未返回任何东西,尽管客户端已连接。但那是因为我没有先使用FD_SET。
-
另外:你必须在调用 select() 之前重新初始化 read_fds 每次(select 改变 fd_sets )。大多数情况下,这是通过从另一个 fd_set 复制来完成的。
-
甜,我想我现在开始明白了。
-
并且,在从 select 返回 -1 后,你应该检查 errno,尤其是 EINTR/EAGAIN/EWOULDBLOCK 不应被视为错误。