如何控制C#Socket的连接超时时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何控制C#Socket的连接超时时间相关的知识,希望对你有一定的参考价值。
参考技术A 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()tryClientSocket=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
MySQL连接超时自动断开连接应该怎样处理
参考技术A 用Fsocket获取数据时能够控制超时的。如果用
File_get_contents($url);
可以临时设定环境变量:
设定默认socket超时时间
ini_set("default_socket_timeout", 3);养成好习惯,使用fsocket获取数据。
如果使用Curl,也可以在Curl中控制超时时间:
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
PHP中mysql函数是不提供类似mysql超时选项的,但是php.ini的mysql.connect_timeout可设置
; Maximum time (in seconds) for connect timeout. -1 means nolimit
mysql.connect_timeout = 60
也可以在php脚本中调用设置ini_set(); 参考技术B 在老版本的MySQL 3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现MyISAM存储引擎之后,也就是从MySQL 3.23开始,MySQL单表最大限制就已经扩大到了64PB了(官方文档显示)。也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定,而是由所在主机的OS上面的文件系统来决定了。
而MySQL另外一个最流行的存储引擎之一Innodb存储数据的策略是分为两种的,一种是共享表空间存储方式,还有一种是独享表空间存储方式。
当使用共享表空间存储方式的时候,Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所 以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单 表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。
而当使用独享表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表限制,又变成文件系统的大小限制了。本回答被提问者和网友采纳
以上是关于如何控制C#Socket的连接超时时间的主要内容,如果未能解决你的问题,请参考以下文章