选择(Select())功能无法正常工作

3

我有一个问题,我使用select函数来等待在服务器端读取到接收的数据,但它的工作方式像是错误的,就好像我什么都没有收到,超时也已经过去了。

服务器端代码:

 int fd = accept(sockfd, addr, addrlen);
 if(fd > 0)
 {
     struct timeval tv;
     fd_set rfds;
     FD_ZERO(&rfds);
     FD_SET(fd, &rfds);

     tv.tv_sec = 5;
     tv.tv_usec = 0;
     // wait when i can read data
     int ret_select = select(1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
     if(ret_select > 0)
     {
         // data ready to be readed. NEVER HERE!
     }
     else
     {
        // nothing. ALWAYS HERE
     }
    }

客户端:

int ret = connect(s, name, namelen);
if(ret == 0)
{
 struct timeval tv;
 fd_set rfds;
 FD_ZERO(&rfds);
 FD_SET(s, &rfds);

 tv.tv_sec = 5;
 tv.tv_usec = 0;
 // wait when we can write
 int ret_select = select(1, (fd_set *) 0, &rfds, (fd_set *) 0, &tv);
 if(ret_select > 0)
 {
  int sended = send(s, my_data, size_data, 0);
  if(sended > 0)
  {
   // all ok, data sended!
  }
 }
}

如果我在服务器端删除对 select 的调用,一切都正常,数据可供读取,因此我猜测 select 在我的代码中运行有误!请问我的代码有什么问题?谢谢!

Becker,很高兴看到昨天"函数工作计时器"问题后你还在继续学习! :) 也许你想要修改问题的标题,改成诸如:"我的select()没有工作"。 - Brady
1个回答

6

select()的第一个参数并不是集合中文件描述符的数量。它应该是:

nfds是三个集合中最高编号的文件描述符再加1。

因此,除非您的套接字文件描述符是0号,否则参数1是错误的。


我知道,第一个参数被忽略了,因为我知道所以我粘贴了 1 - Becker
@Becker 第一个参数仅在使用winsocket的Windows上被忽略。在POSIX平台(例如Linux)上,它必须正确设置。 - Some programmer dude
1
@Becker,将第一个参数从1更改为fd+1 - Brady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接