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。
作为记录,它曾经可以使用一段时间,并且从那时起我就再也没有更改过该代码了。
超时时,selects返回0。下一行将超时设置为1秒。
tv.tv_sec = 1;
Run Code Online (Sandbox Code Playgroud)
通常,套接字已准备好进行写操作,而select将立即返回。但是,如果套接字输出缓冲区中没有空间容纳新数据,则select不会将该套接字标记为可写。
例如,当连接的另一端未调用时,可能会发生这种情况recv/read。未确认的数据量增加,缓冲区最终变满。由于超时时间很小,因此select频繁返回,返回值为0。