【问题标题】:TCP port race condition?TCP端口竞争条件?
【发布时间】:2011-08-06 22:30:21
【问题描述】:

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

【问题讨论】:

  • 你应该看到这篇文章。 stackoverflow.com/questions/570098/…
  • @Nix:是的,我已经在使用此代码,但仍然存在竞争条件,因为两个程序在获得端口可用的信息后尝试连接。

标签: c# tcp client port race-condition


【解决方案1】:

connected 属性有时可能会在它没有真正连接时返回 true。见msdnTcpClient.Connected:

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

我建议你programaticaly check 看看端口是否可用,而不是依赖异常。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多