TCP端口竞争条件?

时间:2011-04-16 14:57:18

标签: c# tcp client 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属性不起作用。

1 个答案:

答案 0 :(得分:0)

当连接属性没有真正连接时,它有时可以返回true。请参见msdn TcpClient.Connected

  

由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应该假定套接字已连接,并正常处理失败的传输

我建议您programaticaly check查看该端口是否可用,而不是依赖于例外。

为了让它变得非常简单,因为你不能依赖于Connected标志,人们通常建议你使用这里找到的模式TcpClient.Connected True, yet not connected