【问题标题】:How to obtain my local IP and Port which is behind a nat during a udp socket session?如何在 udp 套接字会话期间获取位于 nat 后面的本地 IP 和端口?
【发布时间】:2011-12-02 05:55:22
【问题描述】:

我正在做一个 nat 打孔程序,我想知道有没有办法获得我的本地端口?我尝试使用似乎绑定公共端口的“绑定”功能,而不是我机器的端口。

在 Nat 中,我知道 private ip:private port ----mapped--> public IP:public port,我想知道的是私有端口,这样我就可以监听它的数据到达并做我自己的事情他们..希望让自己足够清楚

【问题讨论】:

  • 您使用的是什么框架或库?
  • @Phil,在 ubuntu 下开发..POSIX 我认为

标签: sockets udp port nat


【解决方案1】:

bind() 仅适用于本地计算机。当您有一台机器在 NAT 后面运行时,在该机器上调用 bind() 会绑定机器的私有 IP/端口,而不是 NAT 的公共 IP/端口。所以bind() 后跟getsockname() 为您提供您正在寻找的私有端口,然后listen() 开始监听绑定的私有IP/端口。

要发现 NAT 的公共 IP/端口,您必须使用 uPNP 或 SNMP 查询 NAT 本身,或者查询必须通过 NAT 的外部站点,例如 http://automation.whatismyip.com/n09230945.asphttp://iplookup.flashfxp.com 等。

【讨论】:

    【解决方案2】:

    我不太清楚你想要达到什么目标,但我会尽力向你解释。

    为了穿越 NAT,您必须将数据报从“内部”发送到“外部”。然后NAT存储关联,外部taget可以回答。

    在我刚刚测试的实现中,NAT 以 1:1 映射端口号(很有用,因为端口号可能与协议相关)。

    不过,一旦你发送了第一个数据报,或者你绑定了空地址和空端口,你就可以调用getsockadress(),得到你真正的内部地址和端口。

    您的通信伙伴应使用recvfrom() 以了解数据包的来源。那里有可以找到 NAT 的“外部”数据。

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 2012-04-27
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2012-06-12
      相关资源
      最近更新 更多