C#Socket开发“网络连接超时设置Timeout”,解决网络连接速度过慢的问题
来源:互联网 发布:python 线程池 编辑:程序博客网 时间:2024/04/29 11:53
近日,在进行PPC下的网络通讯程序开发时,当服务器的网络中断或连接异常时,客户端在进行TCP连接请求时“Socket.Connect()”速度明显过慢,通常20-30S才能有异常返回。.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制。因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。为解决这一问题,我查阅了部分资料同时进行了测试,现将解决方法整理如下:
1、部分代码段:
private ManualResetEvent connectDone = new ManualResetEvent(false);
private void ConnectCallback(IAsyncResult ar)
{
try
{
Socket client = (Socket) ar.AsyncState;
client.EndConnect(ar);
}
catch (Exception e)
{
OnErrorEvent(new ErrorEventArgs(e));
}
finally
{
connectDone.Set();
}
}
/// <summary>
/// 开始连接的方法
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <param name="selfIP"></param>
/// <param name="selfPort"></param>
/// <returns></returns>
public bool ClientConnect(IPAddress ip, string port, string selfIP, string selfPort)
{
try
{
IPEndPoint remoteEP = new IPEndPoint(ip, Int32.Parse(port));////网络端点表示为 IP 地址和端口号
//TCP连接
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//开始连接
connectDone.Reset();
clientSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), clientSocket);
connectDone.WaitOne(5000, false);//等待5秒
//连接成功
if (clientSocket.Connected)
{
//do something
}
return true;
}
catch (Exception)
{
return false;
}
}
这里,ManualResetEvent的WaitOne(TimeSpan, Boolean)起到了主要的作用。它将阻止当前线程,直到ManualResetEvent对象被Set或者超过timeout时间。上面的代码中,调用BeginConnect后通过WaitOne方法阻止当前线程,如果在timeoutMSec时间内连接成功,将在CallBackMethod回调中调用connectDone.Set,解除被阻塞的连接线程并返回。
经过测试上面只是解决了连接速度慢的问题(网络异常时),设备可以在连接中断后自动重新连接服务器。但是,我发现当连接不正常时,clientSocket.BeginConnect得到的Socket的Connected属性仍为true,所以要想确保连接的可靠性只能采用信息交互的方式(即客户端向服务端发送要求反馈的信息,并能成功接收到反馈信息时才是正常的连接)。
- C#Socket开发“网络连接超时设置Timeout”,解决网络连接速度过慢的问题
- 网络连接时设置timeout的重要性
- 解决Ubuntu系统启动网络连接超时的问题
- mysql连接超时timeout问题
- 网络的connect如何超时设置?MFC socket异步 timeout select
- 网络的connect如何超时设置?MFC socket异步 timeout select
- adb连接桥问题 timeout连接超时
- Socket设置连接超时
- 设置socket超时连接
- 设置socket超时连接
- c# ManualResetEvent 解决socket连接超时问题
- 网络编程中如何设置连接超时
- 如何设置到映射网络驱动器的超时连接时间
- 解决国内网络Python2.X 3.X PIP安装模块连接超时的问题
- unity开发: socket网络连接
- 解决ssh连接超时(ssh timeout)的方法
- vxwork网络连接超时
- 网络连接超时不起作用
- [C]my hanoi tower(递归练习)
- linux 文件操作指令
- 整理LINUX环境下常用的字符串相关C函数
- pylucene安装手记
- Linux学习汇总
- C#Socket开发“网络连接超时设置Timeout”,解决网络连接速度过慢的问题
- 开博第一篇
- 汇编程序的结构——Hello World !
- Feb 5, 2011, Saturday, 13
- Feb 4, 2011, Friday, 12
- 查看mysql字符集设置
- POJ-3630-Phone List-Trie树(键树、数字查找树、基数树)
- 浅析系统的大小端模式
- Android Frameworks Study 目录