欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Socket連接請求超時機制實現(xiàn)代碼分享

 更新時間:2013年12月09日 11:12:44   投稿:zxhpj  
這篇文章主要介紹了C# Socket連接請求超時機制實現(xiàn),下面提供代碼分享,大家可以參考使用

.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都沒有直接為Connect/BeginConnect提供超時控制機制。因此,或者發(fā)生網絡故障時,客戶端連接請求會等待很長一段時間,直到拋出異常。默認的等待時間長達20~30s。.Net Socket庫的SocketOptionName.SendTimeout提供了控制發(fā)送數(shù)據(jù)的超時時間,但并非本文討論的連接請求的超時時間。
實現(xiàn)

下面是實現(xiàn)的關鍵代碼:

復制代碼 代碼如下:

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();
        }
    }
}

相關文章

最新評論