在我的客户端程序(c ++)中,我尝试使用connect()API通过套接字连接服务器机器。我想制作一个场景,我的客户端应用程序处于阻塞等待状态(即很长一段时间后返回ETIMEDOUT错误)。但是connect()API仅在成功或失败时返回。它没有等待。我该怎么做才能在阻塞等待中生成connect()API。
答案 0 :(得分:1)
除非你已经将套接字设置为非阻塞,否则你实际上是阻塞的,只是connect
被唤醒得足够快。
如果您想测试超时,只需拔掉服务器的网线短时间。
或者,您自己的计算机的网络电缆,但请注意,这也会破坏名称解析,您甚至可能无法达到特定的connect
。
答案 1 :(得分:0)
这可能会回到正面,但是将套接字置于非阻塞模式,发出connect(),然后使用超时调用select()。如果select()超时,则表示连接超时。如果在超时内选择套接字为可写,则再次调用connect()以完成连接,然后将套接字置于阻塞模式并继续进行I / O.当然,检查每一步的错误。
请注意,您只能使用此技术来减少大约一分钟的默认超时,而不是增加它;当然,如果你立即得到连接拒绝,就不会有任何等待:你无法改变它。
答案 2 :(得分:-1)
如果您希望遇到connect
失败的ETIMEDOUT
,您可以创建一个侦听连接但从不接受它们的特殊服务器。当您的客户端连接到该虚拟服务器程序时,它迟早会超时。
当然,这假设您在客户端中创建的套接字不是非阻塞的。