gpt4 book ai didi

c++ - 在读取缓冲区已满时使用 select 检查套接字是否可写

转载 作者:行者123 更新时间:2023-11-28 05:31:00 29 4
gpt4 key购买 nike

我试图在使用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);
}

最佳答案

如果 select() 使用此代码超时,则表示在整个超时期间发送缓冲区已满。

但是你做错了。你应该有一个主 select() 循环来驱动你的代码,而不是这种控制反转,你应该(a)只在你有东西要写的时候写,(b)检测它何时返回 - 1/EWOULDBLOCK/EAGAIN,并且 (c) 此时将套接字 FD 添加到 writeFD​​s 集并推迟写入,直到套接字变得可写。当发生这种情况时,重试写入(这意味着您已经在某处排队数据及其长度),如果成功,则从 writeFD​​s 中删除套接字 FD。

关于c++ - 在读取缓冲区已满时使用 select 检查套接字是否可写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39523656/

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