select()总是返回0

Alo*_*n_T 4 c++ sockets select

我似乎有一个问题select

while(!sendqueue.empty())
{                                   
  if(!atms_connection.connected)
  {
    //print error message
    goto RECONNECT;
  }

  //select new
  FD_ZERO(&wfds);
  FD_SET(atms_connection.socket, &wfds);

  tv.tv_sec = 1;
  tv.tv_usec = 0;

  retval = select(atms_connection.socket + 1, NULL, &wfds, NULL, &tv);

  if (retval == -1) {
    printf("Select failed\n");                      
    break;
  }                     
  else if (retval) {
    printf("Sent a Message.\n"); 
  }
  else {
    //printf("retval value is %d\n",retval);
    printf("Server buffer is full, try again...\n");                        
    break;
  }
  n = write(atms_connection.socket, sendqueue.front().c_str(), sendqueue.front().length());
}
Run Code Online (Sandbox Code Playgroud)

该函数属于线程,当它获取锁时,该线程使用select()清除队列并在循环中写入套接字,直到队列为空。

线程第一次获得锁定就select()可以了,但是第二次获得锁定并进入了线程,而线程总是返回0。

作为记录,它曾经可以使用一段时间,并且从那时起我就再也没有更改过该代码了。

Mak*_*zin 5

超时时,selects返回0。下一行将超时设置为1秒。

tv.tv_sec = 1;
Run Code Online (Sandbox Code Playgroud)

通常,套接字已准备好进行写操作,而select将立即返回。但是,如果套接字输出缓冲区中没有空间容纳新数据,则select不会将该套接字标记为可写。

例如,当连接的另一端未调用时,可能会发生这种情况recv/read。未确认的数据量增加,缓冲区最终变满。由于超时时间很小,因此select频繁返回,返回值为0。