在我的客户端程序(c++)中,我尝试使用connect() API通过套接字连接服务器。我想假设我的客户端应用程序处于阻塞等待状态(即长时间后返回ETIMEDOUT errno )。但是connect() API只返回成功或失败。它不是在等待。在阻塞等待中,我应该怎么做才能让connect() API。
发布于 2012-12-07 19:50:16
除非您已将套接字设置为非阻塞,否则您实际上是在阻塞,只是connect被唤醒得足够快。
如果您要测试是否超时,只需拔下服务器的网线片刻即可。
或者,您自己的机器的网线,但请注意,这也会中断名称解析,您甚至可能无法到达特定的connect。
发布于 2012-12-07 19:40:02
这听起来可能前后不同,但将套接字置于非阻塞模式,发出connect(),然后使用超时调用select()。如果select()超时,就会出现连接超时。如果在超时时间内将套接字选择为可写,则再次调用connect()以完成连接,然后将套接字置于阻塞模式并继续执行I/O。当然,每一步都要检查错误。
请注意,您只能使用此技术来减少大约一分钟的默认超时,而不是增加它;当然,如果您立即收到连接拒绝,则根本不会有等待:您无法更改这一点。
发布于 2012-12-07 19:51:05
如果您想体验ETIMEDOUT失败的connect,您可以制作一个特殊的服务器,该服务器侦听连接,但从不接受它们。当您的客户端连接到那个虚拟服务器程序时,它迟早会超时。
当然,这假设您在客户端中创建的套接字不是非阻塞的。
https://stackoverflow.com/questions/13762279
复制相似问题