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

时间:2015-12-30 14:21:33

标签: c++ c sockets network-programming tcpsocket

总是使用select()或poll()并在send()和recv()调用上强加10秒超时是一个好主意吗?或者我应该让它们无限期地阻止?

强加这种超时(使用select()或poll())会导致我丢失某些错误报告或功能(以返回值的形式),只有使用send()和recv才能获得()?

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

的方式。

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

另一个注意:可以在https://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#faq下的类似常见问题解答中找到与我所谈论内容相关的源代码

谢谢!

4 个答案:

答案 0 :(得分:1)

超时失误后你打算做什么?如果你要再次开始等待,超时不会给你什么。

如果您关闭连接并将其标记为死机,则超时非常有用。

答案 1 :(得分:1)

select()和poll()只是告诉你哪些文件描述符可以读取。一旦你知道哪些文件描述符已经准备就绪,你仍然可以在它们上面调用recv(),这样你就可以获得相同的返回值/错误检查。

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

答案 2 :(得分:0)

以“始终是一个好主意”开头的问题回答通常是“不”。在这里,答案取决于你poll()的方式,所以不,这不总是一个好主意。

如果poll()在一个单独的线程中,其目标是等待数据,则超时将不会执行任何操作。

答案 3 :(得分:-1)

我在syncron aproach中使用套接字,然后你必须使用超时。但更好但更难的方法是使用它们asyncron。因此,在他们自己的线程中运行,他们可以阻止并将使用最少的资源......

相关问题