2011-04-16 84 views
0

我想多次啓動我的程序,並且每個實例都嘗試使用TCP連接到同一個服務器端口。我打算讓第一個連接,其餘的客戶端應該嘗試連接到不同的端口。TCP端口競爭狀態?

我用這個代碼連接:

TcpClient tcp; 
StreamReader streamReader; 
StreamWriter streamWriter; 

bool success=false; 
while (!success) { 
    try 
    { 
    tcp = new TcpClient(Hostname, currentPort); 

    streamReader = new StreamReader(tcp.GetStream()); 
    streamWriter = new StreamWriter(tcp.GetStream()); 
    success=true; 
    } catch { 
    // wait a bit... 
    } 
} 

現在第一個將成功地連接,但第二個沒有得到一個例外,但也沒有連接。我怎樣才能確定一個程序是否真的連接? tcp.Connected屬性不起作用。

+0

你應該看到這個帖子。 http://stackoverflow.com/questions/570098/in-c-how-to-check-if-a-tcp-port-is-available – Nix 2011-04-16 15:01:25

+0

@Nix:是的,我已經使用此代碼,但仍然存在兩個程序在獲得端口可用信息後嘗試連接的競態條件。 – Michael 2011-04-16 15:07:00

回答

0

連接的屬性有時可能返回true,當它沒有真正連接時。請參閱MSDN TcpClient.Connected

,因爲連接的屬性只反映了連接,最近一次操作的狀態,你應該嘗試發送或接收消息,以確定當前狀態。消息發送失敗後,此屬性不再返回true。請注意,這是行爲設計​​。您無法可靠地測試連接的狀態,因爲在測試和發送/接收之間的時間內,連接可能已丟失。您的代碼應承擔套接字連接,並妥善處理失敗的傳輸

我建議你programaticaly check看到的,而不是依靠例外端口是否可用。

,併爲你它很簡單,因爲你不能依靠連旗,人們普遍建議你用這裏TcpClient.Connected True, yet not connected發現一個規律: