您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> 编程语言综合 >> 正文

C# Socket连接请求超时机制实现代码分享

作者:佚名    责任编辑:admin    更新时间:2022-06-22

 这篇文章主要介绍了C# Socket连接请求超时机制实现,下面提供代码分享,大家可以参考使用

.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时控制机制。因此,当服务器未处于监听状态,或者发生网络故障时,客户端连接请求会被迫等待很长一段时间,直到抛出异常。默认的等待时间长达20~30s。.Net Socket库的SocketOptionName.SendTimeout提供了控制发送数据的超时时间,但并非本文讨论的连接请求的超时时间。 实现   下面是实现的关键代码:   代码如下: class TimeOutSocket {     private static bool IsConnectionSuccessful = false;     private static Exception socketexception;     private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);       public static TcpClient TryConnect(IPEndPoint remoteEndPoint, int timeoutMiliSecond)     {         TimeoutObject.Reset();         socketexception = null;             string serverip = Convert.ToString(remoteEndPoint.Address);         int serverport = remoteEndPoint.Port;                    TcpClient tcpclient = new TcpClient();           tcpclient.BeginConnect(serverip, serverport,              new AsyncCallback(CallBackMethod), tcpclient);           if (TimeoutObject.WaitOne(timeoutMiliSecond, false))         {             if (IsConnectionSuccessful)             {                 return tcpclient;             }             else             {                 throw socketexception;             }         }         else         {             tcpclient.Close();             throw new TimeoutException("TimeOut Exception");         }     }     private static void CallBackMethod(IAsyncResult asyncresult)     {         try         {             IsConnectionSuccessful = false;             TcpClient tcpclient = asyncresult.AsyncState as TcpClient;               if (tcpclient.Client != null)             {                 tcpclient.EndConnect(asyncresult);                 IsConnectionSuccessful = true;             }         }         catch (Exception ex)         {             IsConnectionSuccessful = false;             socketexception = ex;         }         finally         {             TimeoutObject.Set();         }     } }