簡體   English   中英

TCP端口競爭條件?

[英]TCP port race condition?

我想多次啟動程序,每個實例都嘗試使用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無效。

當未真正連接時,connected屬性有時可能返回true。 參見msdn TcpClient.Connected

由於Connected屬性僅反映最新操作的連接狀態,因此您應嘗試發送或接收消息以確定當前狀態。 消息發送失敗后,此屬性不再返回true。 請注意,此行為是設計使然。 您無法可靠地測試連接狀態,因為在測試和發送/接收之間的時間內,連接可能已經丟失。 您的代碼應假定套接字已連接,並且可以正常處理失敗的傳輸

我建議您通過編程檢查端口是否可用,而不要依賴異常。

為了使它真正簡單,因為您不能依賴Connected標志,所以人們通常建議您使用在此處找到的模式TcpClient.Connected True,但尚未連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM