TCP端口竞争状态

本文关键字:状态 竞争 TCP | 更新日期: 2023-09-27 17:50:16

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

TCP端口竞争状态

当未真正连接时,connected属性有时会返回true。参见msdn TcpClient。连接:

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

我建议您通过编程检查端口是否可用,而不是依赖于异常。

并且为了使它对您来说非常简单,因为您不能依赖于已连接标志,人们通常建议您使用在TcpClient中找到的模式。已连接: