![](/img/trans.png)
[英]Winsock tcp/ip Socket listening but connection refused, race condition?
[英]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.