新TcpClient(MachineName,port)和新TcpClient(新IPEndpoint(...,Port))之间的区别

时间:2011-03-31 10:58:48

标签: vb.net sockets tcp tcpclient tcplistener

Hej Hej,

我有一个必须在服务器2008集群上运行的.Net程序。 为了找到正确的IP,我通过

解析dns
GetHostEntry(VarDefinedInfConfig).AddressList(0)

但是当我转换旧代码时(此代码选择错误的IP)dns.GetHostName().AddressList(0) =>这将返回虚拟IP,而不是正确的IP。

所以我将TcpListener更改为(dns是来自配置的参数)

Dim listener As TcpListener = New TcpListener(New IPEndPoint(Net.Dns.GetHostEntry(dns).AddressList(0), 8001))
listener.Start()

旧方式,此代码定义了tcpclient

  Dim client As TcpClient = New TcpClient(Environment.MachineName, 8001)
  Console.WriteLine("Done...")
  client.Close()

这也连接到错误的IP,因此我发现了TcpClient的重载并使用了那个

新方法:

 Dim client2 As TcpClient = New TcpClient(New IPEndPoint(Net.Dns.GetHostEntry(dns).AddressList(0), 8001))
    Console.WriteLine("Done")
    client2.Close()

但是当我使用第二个时,我得到了例外“通常只允许使用每个套接字地址(协议/网络地址/端口)。

奇怪的是,如果我从MachineName获取的IP与从带有参数的dns中获取的ip完全相同。

有人知道这个例外的原因吗?通常他们应该有相同的结果。

格尔茨,

乔纳森

3 个答案:

答案 0 :(得分:3)

您是否有可能忽略了2个提到的TcpClient构造函数(MSDN)之间的主要区别?:

  

TcpClient(String,Int32).. 连接到指定主机 上的指定端口

     

TcpClient(IPEndPoint).. 将其绑定到指定的本地端点

如此有效,使用第一个构造函数,在可用的“OS分配的”本地端口上打开套接字,然后连接到服务器,其地址或DNS名称和端口作为参数传入;之后,您已准备好发送或接收数据。

使用第二个构造函数,只在某个本地端口(在端点参数中标识)上打开一个套接字,但这就是全部 - 没有连接到任何[远程,甚至是本地]服务器,因为没有服务器信息众所周知;在进行任何通信操作之前you'd need to call one of Connect(.) methods(类似于您找到的解决方法)。

答案 1 :(得分:0)

为什么不在应用程序配置中指定正确的IP?

  

通常只允许使用每个套接字地址(协议/网络地址/端口)

表示某人(您的或其他应用程序)已在侦听该IP /端口。

答案 2 :(得分:0)

现在我用一个解决方法。我创建一个带有空构造函数的TcpClient(),然后我使用Connect(IPendpoint),这是有效的。