如何控制C#Socket的连接超时时间

如何控制C#Socket的连接超时时间,第1张

Socket.connect连接超时有二种情况:

1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间。这在国外访问weibo时,并且网络环境极差的情况下有可能发生。解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.但是当调大之后,发现不到10s就报timeout exception。通过国外的机器ping api.weibo.com发现unreachable。说明客户端在传输层之下的网络层就发现连个Syn的报文都发不出去,更不用说三次握手了,客户端直接失败并抛timeout exception。

经验:在connection timeout诊断的第一步应该是ping一下确认网络层没有问题。注:客户端设置了timeout,但并不会等到超时才返回异常。客户端只要第一时间发现连接失败,就会抛timeout exception。2.如果timeout设置的时间足够,但是由于服务器端的处理能力较差,比如缓冲连接队列较小,而应用层的处理能力没有连接缓冲快,导致缓冲连接占满,而拒绝新的连接。在服务端因为连接队列占满而拒绝服务的期间,客户端的通过TCP协议重试三次。每次的时间翻倍。如果三次时间的累加<timeout参数值且能连接上,属于正常情况,表示队列腾出空位放当前连接。如果三次时间的累加<timeout参数值且未能连接上,则客户端会立刻抛出timeout exception,而不等timeout到期才抛。

下面是一个异步socket典型的连接程序connectDone 是ManualResetEvent类型可以在connectDone.WaitOne()中使用等待的时间来限制连接超时比如connectDone.WaitOne(5000)是超时时间为5秒connectDone.WaitOne()

public void Conn(){try{ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP)IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort)connectDone.Reset()ClientSocket.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback),ClientSocket)connectDone.WaitOne()StateObject state = new StateObject(bufferSize,ClientSocket)ClientSocket.BeginReceive(state.buffer,0,bufferSize,0,new AsyncCallback(ReceiveCallback), state)}catch(Exception e){OnErrorEvent(new ErrorEventArgs(e))}}所有代码见:http://blog.csdn.net/zhiang75/article/details/75915

如果IP或端口填错了 就用socket 的 setSoTimeout(timeout)这个方法 这个是连接超时时间,单位是毫秒,就是在timeout/1000秒内如果没有完成TCP连接,就会触发超时异常。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7901781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存