我正在尝试在使用send
之前检查套接字是否可写。这样工作正常,除非套接字的读缓冲区已满,然后select
超时(至少那是我所期待的,行为是在向套接字发送大量数据之后)不使用recv
,select
返回0.如果我读了一些东西再试一次,它会再次正常运行)。我希望完整的读缓冲区不会阻止发送。我做错了什么?
int testwriteable(SOCKET socket) {
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100; //100 us (microseconds)
fd_set set;
FD_ZERO(&set);
FD_SET(socket, &set);
//check for writable
return select(1, NULL, &set, NULL, &timeout);
}
答案 0 :(得分:1)
如果使用此代码select()
超时,则表示发送缓冲区在整个超时期间已满。
但你做错了。你应该有一个主select()
循环驱动你的代码,而不是这种控制反转,你应该(a)只在你有东西要写的时候写,(b)检测它何时返回-1 / EWOULDBLOCK / EAGAIN ,(c)此时将套接字FD添加到writeFDs
集合并推迟写入,直到套接字变为可写。当发生这种情况时,重试写入(这意味着您已将数据及其长度排在某处),如果成功,则从writeFDs
中删除套接字FD。