1

在我的客户端程序(c++)中,我试图使用 connect() API 通过套接字连接服务器机器。我想制作一个场景,即我的客户端应用程序处于阻塞等待状态(即在很长一段时间后返回 ETIMEDOUT errno)。但是 connect() API 只返回成功或失败。它不是在等待。我应该怎么做才能使 connect() API 处于阻塞等待状态。

4

3 回答 3

1

除非您将套接字设置为非阻塞,否则您实际上是阻塞的,只是connect被唤醒的速度足够快。

如果要测试超时,只需将服务器的网线拔掉一会儿即可。

或者,您自己机器的网络电缆,但请注意,这也会破坏名称解析,您甚至可能无法访问特定connect的 .

于 2012-12-07T11:50:16.290 回答
0

这听起来可能是前后矛盾,但将套接字置于非阻塞模式,发出 connect(),然后在超时时调用 select()。如果 select() 超时,则说明您的连接超时。如果它在超时时间内选择了可写的套接字,则再次调用 connect() 以完成连接,然后将套接字置于阻塞模式并继续进行 I/O。当然,在每个步骤中检查错误。

请注意,您只能使用此技术来减少大约一分钟的默认超时时间,而不是增加它;当然,如果您立即拒绝连接,则根本无需等待:您无法更改。

于 2012-12-07T11:40:01.507 回答
-1

如果您想体验 aconnect的失败ETIMEDOUT,您可以创建一个特殊的服务器来侦听连接但从不接受它们。当您的客户端连接到该虚拟服务器程序时,它迟早会超时。

当然,这假设您在客户端中创建的套接字不是非阻塞的。

于 2012-12-07T11:51:05.497 回答