C# TCP端口竞争条件?

C# TCP端口竞争条件?,c#,tcp,client,port,race-condition,C#,Tcp,Client,Port,Race Condition,我想多次启动我的程序,每个实例都尝试使用TCP连接到同一个服务器端口。我的目的是让第一个客户端连接,其余客户端应尝试连接到其他端口 我使用此代码连接: TcpClient tcp; StreamReader streamReader; StreamWriter streamWriter; bool success=false; while (!success) { try { tcp = new TcpClient(Hostname, currentPort); st

我想多次启动我的程序,每个实例都尝试使用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不起作用。

连接的属性有时可能返回true,但它不是真正连接的。见msdn:

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

我建议您查看端口是否可用,而不是依赖于异常


为了让事情变得简单,因为你不能依赖连接标志,人们通常建议你使用这里的模式:

你应该看看这篇文章@尼克斯:是的,我已经在使用这段代码了,但仍然存在竞争条件,因为两个程序在获得端口可用的信息后都试图连接。