2

如果我执行以下操作:

UdpClient c = new UdpClient();
c.Connect(new System.Net.IPEndPoint(IPAddress.Parse("69.65.85.125"), 9900));
c.Send(new byte[] { 1,2,3,4,5 }, 5);

然后我将向我的路由器发送一个数据包,然后我的路由器将该数据包发送到 IP“69.65.85.125”。

如果我在 ip 为“69.65.85.125”的计算机上捕获该数据包的位置,我将能够看到路由器打开的端口(client.RemoteEndpoint)。如果不在另一个端点捕获数据包,怎么可能看到这些信息?有没有办法查询路由器?

4

2 回答 2

2

为了获得公共 IP,远程设备应通过向您发送一个 UDP 数据包来响应,其中包含它看到的 IP 地址和端口。这是STUN服务器背后最基本的概念之一,通常用于 UDP 打孔算法。

几个免费的 STUN 服务器可以做到这一点。向其中一个发送“绑定”请求,您将收到包含您的公共 IP 地址和端口的响应。

stun.l.google.com:19302
stun1.l.google.com:19302
stun2.l.google.com:19302
stun3.l.google.com:19302
stun4.l.google.com:19302
stun01.sipphone.com
stun.ekiga.net
stun.fwdnet.net
stun.ideasip.com
stun.iptel.org
stun.rixtelecom.se
stun.schlund.de
stunserver.org
stun.softjoys.com
stun.voiparound.com
stun.voipbuster.com
stun.voipstunt.com
stun.voxgratia.org
stun.xten.com

如果您真的对进行适当的 UDP 打孔感兴趣,请查看ICE(交互式连接建立)。这是一个出色的算法,它使用 STUN 和另一个称为TURN的协议来保证对等点之间的成功连接。(Apple 将其用于 Facetime 视频通话等。)

如果你有兴趣,我工作的公司开发了一款名为IceLink的产品,它使用 ICE/STUN/TURN 在对等点之间建立直接数据流。SDK 适用于 .NET、Mac、iOS、Android、Java、Windows Phone、Windows 8、Unity、Xamarin 等,甚至包括对WebRTC音频/视频流的完全支持。

于 2013-07-17T21:53:08.157 回答
2

如果您的路由器支持它,您可以通过 UPnP 查询它。这是我为 .NET 找到的 UPnP 包装库,我从未使用过它,所以我无法给你任何建议,无论它是否好用。

查看 ComponetsTest 程序以获取库 zip 中的示例代码。您需要参考UPnP 文档来了解您需要对服务进行哪些调用。

从有人询问如何查找端口映射的库的留言板上。

WANPPPConnection 和 WANIPConnection 服务有名为 GetSpecificPortMappingEntry 的动作,只需调用这个从 0 开始迭代索引直到返回错误,每次调用都会返回另一个 UPnP 端口映射,您还可以使用不同的服务获取静态映射。

于 2013-05-31T01:08:57.737 回答