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

C++ 在套接字send()和recv()上使用超时,c++,c,sockets,network-programming,tcpsocket,C++,C,Sockets,Network Programming,Tcpsocket,始终使用select()或poll()并对send()和recv()调用都施加10秒的超时是一个好主意吗?还是我应该让他们无限期地封锁 强加这种超时(使用select()或poll())是否会导致我丢失一些仅使用send()和recv()时可以获得的错误报告或功能(以返回值的形式) 注意:假设我在调用recv()或send()之前在同一线程中轮询。对poll()的调用是静态格式良好的,也就是说,参数除了根据包装的recv()或send()的调用进行更改外,不会动态更改 另一个注意事项:如果有超时

始终使用select()或poll()并对send()和recv()调用都施加10秒的超时是一个好主意吗?还是我应该让他们无限期地封锁

强加这种超时(使用select()或poll())是否会导致我丢失一些仅使用send()和recv()时可以获得的错误报告或功能(以返回值的形式)


注意:假设我在调用recv()或send()之前在同一线程中轮询。对poll()的调用是静态格式良好的,也就是说,参数除了根据包装的recv()或send()的调用进行更改外,不会动态更改

另一个注意事项:如果有超时,那么我将抛出一个异常,让程序员捕获它。我希望这能防止DOS攻击。如果确实有超时。我将抛出一个异常,无法调用recv()或send()

还有一个注意事项:与我所说内容相关的源代码可以在这里的类似FAQ下找到


谢谢

对以“始终是一个好主意”开头的问题的回答通常是“否”。在这里,答案取决于您投票的方式,所以不,始终不是一个好主意


如果在一个单独的线程中执行poll(),而该线程的目标只是等待数据,那么超时不会起任何作用。

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

超时后,您将怎么做?如果您要再次开始等待,则超时不会给您任何信息

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

select()和poll()只需告诉您哪些文件描述符可以读取即可。一旦知道哪些文件描述符已经准备好,您仍然可以对它们调用recv(),这样无论哪种方式,您都可以得到相同的返回值/错误检查


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

您到底想解决什么问题?如果暂停,你会怎么做?重新开始投票?还是退出?还是别的什么?如果出现其他错误,您希望怎么做?如果接收端真的处于“慢行”状态,并且消息正在到达,但速度非常慢(例如,有人用慢得多的链接替换了快速链接),您希望发生什么情况?您能提供一些代码吗?DOS攻击通常是“大量流量”,而不是“无流量”,这是超时的原因……我编辑了上面的问题!很抱歉第一次不够清楚。@MatsPeterson是的,你是对的!但我想到的攻击类型是当我等待recv()时,逻辑上我应该获得更多数据,因为到目前为止请求不完整,攻击者只是坐在那里不发送任何数据。通常情况下,回答是错误的。在许多情况下,完全不需要在单独的线程中执行套接字操作。对poll()的调用是静态格式良好的,也就是说,参数不会动态变化,除了基于包装的recv()或send()/poll调用的方式外,还有一个优点,就是超时是站点可配置的。然而,这个答案很好。如果我打算抛出一个异常,说超时发生了,这是一个好主意吗?@好奇,我不知道。这在你的申请中是个好主意吗?超时是一种例外情况吗?你绝对不能在呼叫站点容忍它,也不能理智地将错误传播到上游?我还没有考虑任何应用程序,但我只是觉得每个recv呼叫在实际场景中使用时都应该有某种超时,对吗?@好奇,有许多应用程序不处理任何超时,只是等待数据或连接中断。常规HTTP服务器如何?这样的服务器中的recv()调用应该具有这样的超时,对吗?