2011-11-04 329 views
1

在C#中我試圖測試連接到這樣的端口:超時的TCP連接嘗試的

Socket socket = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, 
        ProtocolType.Tcp); 

socket.Connect(telco.Address, telco.Port); 

當端口可用時,它的偉大工程。但是,如果端口不可用(例如TCP/81上的google.com),則需要很長時間(約60秒)纔會超時。這是一個狀態頁面,所以我想失敗相對較快。

我試圖設置socket.SendTimeout和socket.RecieveTimeout 5000ms(5秒),但似乎沒有效果。

+0

您可能需要一種解決方法。看到類似的問題:http://stackoverflow.com/questions/1062035/how-to-config-socket-connect-timeout-in-c-sharp – Vlad

回答

1

我結束了類似下面的代碼要保持簡單:

Socket socket = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, 
        ProtocolType.Tcp); 

IAsyncResult result = socket.BeginConnect(telco.Address, telco.Port, null, null); 

bool connectionSuccess = result.AsyncWaitHandle.WaitOne(5000, true); 
+0

不要逃避線程,因爲你會很快或碰到它,因爲你是在異步做的東西。 –

+0

這是一個狀態頁面,它檢查幾個TCP端口,看它們是否還活着,並且不會對它們做任何事情。我認爲在這種情況下脫離線程是正確的做法。 –

+0

是的,我忽略了你的問題的第一句話... –

0

認爲你正在尋找socket.ReceiveTimeout();

或使用beginConnect()並使用同步工具(如AutoResetEvent)來捕獲超時。

看到這個帖子:How to configure socket connect timeout

+0

我已經嘗試過。我還將這一點添加到了我的原始問題中。謝謝。 –

+0

看起來像弗拉德的正確有其他職位有答案 – MandoMando

0

要精細地控制您的超時,這樣做:

  • 火起來一個線程上面
  • 代碼線程被解僱和插座連接嘗試後,做你需要什麼(即你有一點時間,至少Application.DoEvents()
  • Thread.Sleep()爲所需的超時間隔或使用其他方法來使時間通過
  • 檢查連接是否從主線程打開。您可以通過觀察成功建立連接後設置的某個狀態變量來完成此操作。
  • 如果是這樣,請使用連接。如果沒有,請在您的等待套接字上使用Socket.Close()來中斷連接嘗試。

是的,你會得到嘗試連接線程的例外,但你可以放心地吞噬它,並承擔一切正常。

http://msdn.microsoft.com/en-us/library/wahsac9k(v=VS.80).aspxSocket.Close()

相關問題