在套接字 send() 和 recv() 上使用超时

Using timeouts on socket send() and recv()

始终使用 select() 或 poll() 并在 send() 和 recv() 调用上施加 10 秒超时是个好主意吗?还是我应该让他们无限期地阻止?

是否施加这种超时(使用 select() 或 poll())导致我失去某种错误报告或功能(以 return 值的形式),我仅使用 send() 和 recv() 就可以得到?

注意:假设我在调用 recv() 或 send() 之前在同一个线程中进行轮询。并且对 poll() 的调用是静态格式良好的,即除了基于包装的 recv() 或 send()

的调用之外,参数不会动态变化

另外注意:如果超时,我会抛出一个异常让程序员捕获它。我希望这可以防止 DOS 攻击。如果确实超时。我将抛出一个异常,而不是调用 recv() 或 send()

还有一条注意事项:与我正在谈论的内容相关的源代码可以在此处 https://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#faq 下的类似常见问题解答下找到

谢谢!

以 "Is is a good idea to ALWAYS" 开头的问题的答案通常 "no." 在这里,答案取决于您 poll() 的方式,所以不,这并不总是一个好主意。

如果您poll()在一个单独的线程中,其目标是等待数据,超时不会做任何事情。

如果你在 syncron 方法中使用套接字,那么你必须使用超时。但是更好但更难的方法是使用它们异步。因此,运行 在他们自己的线程中,他们可以阻塞并使用最少的资源...

超时后你打算做什么?如果您要再次开始等待,那么超时不会给您带来任何好处。

如果您要关闭连接并将其标记为已死,那么超时非常有用。

select() 和 poll() 只是告诉您哪些文件描述符已准备好读取。一旦知道哪些文件描述符已准备就绪,您仍然可以对它们调用 recv(),这样您将获得相同的 return values/error 检查。

如果您有多个 sockets/file 描述符可供读取,您实际上只需要使用 select() 或 poll() 。如果您只需要在单个套接字上超时,那么您可以使用带有 SO_RCVTIMEO 选项的 setsockopt() 来允许 recv() 调用超时。参见 this answer