2013-10-29 13 views
4

有沒有可能AcceptSocketTcpListener對象超時,以便它偶爾中斷一次?在AcceptSocket超時?

TcpListener server = new TcpListener(localIP, port); 
server.Start(); 
while (!shuttingDown) 
    try 
    { 
     Socket client = server.AcceptSocket(); 
     if (client != null) 
     { 
      // do client stuff 
     } 
    } 
    catch { } 

試圖BeginAccept和EndAccept:如何終止如果有喜歡的3秒內沒有客戶端的接受? (我試圖接近這裏的解決方案)如果有新的客戶端建立連接

server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server); 
Thread.Sleep(3000); 
server.EndAcceptTcpClient(???); 
+2

您應該在偵聽器線程中實現偵聽。您可以簡單地中止偵聽器線程。否則,您可以使用方法TcpListener.BeginAcceptSocket,它允許您異步實現偵聽。 – helb

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

0

此代碼檢查。如果是的話AcceptSocket()被調用。唯一的問題是服務器必須經常檢查以便快速響應客戶端。

TcpListener server = new TcpListener(localIP, port); 
server.Start(); 
while (!shuttingDown) 
{ 
    if (server.Pending()) 
    { 
     Socket client = server.AcceptSocket(); 
     if (client != null) 
     { 
      // do client stuff 
     } 
    } 
    else 
     Thread.Sleep(1000); 
} 
+1

爲了解決這個問題,我很生氣知道我的Web請求被阻止了一秒鐘。 –

+0

這個答案與Ryan Williams的答案完全一樣,如果你將你的睡眠設定爲10.我不需要仇恨或反對票的理由。 –

+0

任何人爲了憤怒的人而修改這個解決方案是絕對不可能的。我的意思是這4個角色被刻在石頭上。你甚至不能**想要改變它們。 – Bitterblue

0

只需在偵聽套接字上設置接收超時值即可。這會導致accept()以超時發生的方式超時,無論在C#中如何。

3

我已經創建了以下擴展方法作爲接受超時參數的TcpListener.AcceptSocket的重載。

/// <summary> 
    /// Accepts a pending connection request. 
    /// </summary> 
    /// <param name="tcpListener"></param> 
    /// <param name="timeout"></param> 
    /// <param name="pollInterval"></param> 
    /// <exception cref="System.InvalidOperationException"></exception> 
    /// <exception cref="System.TimeoutException"></exception> 
    /// <returns></returns> 
    public static Socket AcceptSocket(this TcpListener tcpListener, TimeSpan timeout, int pollInterval=10) 
    { 
     var stopWatch = new Stopwatch(); 
     stopWatch.Start(); 
     while (stopWatch.Elapsed < timeout) 
     { 
      if (tcpListener.Pending()) 
       return tcpListener.AcceptSocket(); 

      Thread.Sleep(pollInterval); 
     } 
     throw new TimeoutException(); 
    }