Hej Hej,
我有一个必须在服务器2008集群上运行的.Net程序。 为了找到正确的IP,我通过
解析dnsGetHostEntry(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完全相同。
有人知道这个例外的原因吗?通常他们应该有相同的结果。
格尔茨,
乔纳森
答案 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),这是有效的。