选择()对我不起作用

Select() not working for me

本文关键字:不起作用 选择      更新时间:2023-10-16

我有一个问题,当我可以在服务器端读取接收到的数据时,我使用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在我的代码中工作错误!

我的代码有什么问题?

谢谢!

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

NFDS 是三个集合中编号最高的文件描述符,加上 1。

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