【问题标题】:Difference between new TcpClient(MachineName, port) and new TcpClient(new IPEndpoint(..., Port))new TcpClient(MachineName, port) 和 new TcpClient(new IPEndpoint(..., Port)) 的区别
【发布时间】:2011-07-26 19:20:12
【问题描述】:

嘿嘿嘿,

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

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

但是当我转换我的旧代码时(此代码选择了错误的 IP)dns.GetHostName().AddressList(0) => 这将返回一个虚拟 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 完全相同。

有人知道这个异常的原因吗?通常它们应该具有相同的结果。

问候,

乔纳森

【问题讨论】:

    标签: vb.net sockets tcp tcpclient tcplistener


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • Hej,感谢您的回答。我不能因为 IP 可以更改(DHCP)并且我们的程序可以在从 DHCP 获取 IPAddress 的 pc 下运行。我使用 netstat -a 来确认这一点,没有人在使用这个端口/IPAddress。问题是为什么它在使用机器名和端口时起作用(它具有相同的 IP)。所以在幕后它应该导致我在 IPEndpoint 中提供相同的 IP 和端口。问候
    • 现在我使用工作区。我用一个空的构造函数创建了一个 TcpClient() ,然后我使用了 Connect(IPendpoint) 并且这有效。
    【解决方案3】:

    现在我使用工作区。我用一个空的构造函数创建了一个 TcpClient(),然后我使用了 Connect(IPendpoint),这样就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2011-11-22
      • 2018-03-20
      • 2013-05-14
      相关资源
      最近更新 更多