繁体   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