TCP/IP的一个问题请教各位,怎么可以设connect的连接超时时间?

在QXN4.25里,我使用了阻塞的STREAM方式的SOCKET,我想设定connect的连接超时的时间,却省的大概是30秒。这个时间可以通过setsockopt或别的方式来改变吗?如果可以要怎么做?请教各位高手。

通常是在调用connect()之前开一个时钟。

Mr. xtang ,可能我的问题提的有些笼统。我再把提出这个问题的现象稍详细的说一下。具体是这样的:
1、首先客户机已经与服务端建立了连接并且处于正常通信状态;
2、此时如果我强行使通信中断,比如拔出网线,我的应用程序会认为此连接已经断开,会从数据通信中退出重新试图建立新的连接;
3、这时我会发现这样的现象(下面的情况前提都是服务端总是处于监听状态)
a如果我一直不重新插回网线,connect调用开始后要30秒才返回
b我在connect调用开始后计时,如果在10秒内重新插回网线,那么立刻客户端会跟服务端建立连接;如果我在10秒后这样做,那么总是要等到差不多30秒的时候才会建立连接
4、所以我想解决在10秒后插回网线但要30秒才能建立连接的问题。在这30秒内好象connect总处于组塞状态,即使我在之前使用定时器,也不能使它脱离这个组塞状态。
不知道我是否把这个问题描述清楚,请唐先生帮忙解决一下。谢谢!

这是TCP的重传引起的。拔线后的Connect()会让TCP传出一个包去(SYN),这个包,因为线被拔而丢失。TCP经过一个超时后,会重传。重传失败,再超时,再重传。为了有效重传,每次的超时间隔都是不一样的。手头没有资料可以确认,但我记得是,1秒,2秒,4秒,8秒,16秒,32秒,64秒,64秒、、、也就是说,重传发生在connect()开始1,3,7,15,31…后,如果你在第6秒恢复网络,那么第7秒的重传就可以connect() 成功。如果你在第16秒拔线,你要到第31秒才会被接通。

上面的重传过程是在协议栈里完成的,也是RFC的要求,用户程序是没有办法控制的。你的情况,有两个问题值得考虑。

1)如果你的客户机与服务端已经有了一个连接的话,即使拔网线,TCP也会自动重传,到TCP认为失败放弃连接为止,有大约9分半的时间。在这段时间里如果网络恢复的话,通信会自动恢复。你的用户程序不应该退出数据通信。

2)如果你一定要做,又希望控制connect()时间的话,可以在调用connect()之前,先用UDP包试一下,比如每隔1秒发一个UDP包给服务器端,直到有了应答后再connect()。这个方法的缺点是,你必须在服务器段有一个UDP服务,供你使用。当然,你也可以发ICMP包,不过要注意,Internet上有不少防火墙是禁止ICMP的。

谢谢你Mr.xtang,我的应用需要在拔出网线后立刻有反应,而且我无法区分是拔出网线还是有一方出现别的通信故障,比如死机或关机什么的。
你的提议我觉得很好,我会试一下你的第二个提议。谢谢!