gpt4 book ai didi

c++ - select() 总是返回 0

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:11 24 4
gpt4 key购买 nike

我似乎对 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());
}

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

线程第一次获取锁 select() 没问题,但第二次获取锁并进入 while 时总是返回 0。

郑重声明,它以前工作得很好,从那以后我就没有更改过该代码。

最佳答案

Selects 在超时时返回 0。以下行将超时指定为 1 秒。

tv.tv_sec = 1;

通常套接字准备好写入并且选择会立即返回。但是,如果套接字输出缓冲区中没有空间容纳新数据,则 select 不会将此套接字标记为准备好写入。

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

关于c++ - select() 总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13118705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com