2011-04-16 87 views
0

我想多次启动我的程序,并且每个实例都尝试使用TCP连接到同一个服务器端口。我打算让第一个连接,其余的客户端应该尝试连接到不同的端口。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属性不起作用。

+0

你应该看到这个帖子。 http://stackoverflow.com/questions/570098/in-c-how-to-check-if-a-tcp-port-is-available – Nix 2011-04-16 15:01:25

+0

@Nix:是的,我已经使用此代码,但仍然存在两个程序在获得端口可用信息后尝试连接的竞态条件。 – Michael 2011-04-16 15:07:00

回答

0

连接的属性有时可能返回true,当它没有真正连接时。请参阅MSDN TcpClient.Connected

,因为连接的属性只反映了连接,最近一次操作的状态,你应该尝试发送或接收消息,以确定当前状态。消息发送失败后,此属性不再返回true。请注意,这是行为设计​​。您无法可靠地测试连接的状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应承担套接字连接,并妥善处理失败的传输

我建议你programaticaly check看到的,而不是依靠例外端口是否可用。

,并为你它很简单,因为你不能依靠连旗,人们普遍建议你用这里TcpClient.Connected True, yet not connected发现一个规律: