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

 我来答
野人无事不言L
2017-07-14 · TA获得超过1414万个赞
知道顶级答主
回答量:2242万
采纳率:0%
帮助的人:145.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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式