如果我执行以下操作:
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
)。如何在不从另一个角度捕获数据包的情况下看到该信息?有没有办法查询路由器?
答案 0 :(得分:2)
如果您的路由器支持它,您可以通过UPnP查询它。 Here is a wrapper library对于UPnP我发现.NET,我从未使用它,所以如果它是好的,我不能给你任何建议。
查看ComponetsTest程序,了解库中zip的示例代码。您需要参考UPnP documentation以了解您需要为服务拨打哪些电话。
来自询问如何查找端口映射的人的message board of the library。
WANPPPConnection和WANIPConnection服务具有调用的操作 GetSpecificPortMappingEntry,只需调用此迭代即可 索引从0开始直到返回错误,每次调用都将返回 另一个UPnP端口映射,你也可以得到一个静态映射 不同的服务。
答案 1 :(得分:2)
为了获取公共IP,远程设备应该通过向您发送包含其看到的IP地址和端口的UDP数据包来进行响应。这是STUN服务器背后最基本的概念之一,常用于UDP穿孔算法。
有several free STUN servers可用来做到这一点。向其中一个发送“绑定”请求,您将获得带有公共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 (Interactive Connectivity Establishment)。这是一个很好的算法,它使用STUN和另一个名为TURN的协议来保证对等体之间的成功连接。 (Apple将其用于Facetime视频通话等。)
如果您感兴趣,我所工作的公司开发了一种名为IceLink的产品,它使用ICE / STUN / TURN在对等体之间建立直接数据流。 SDK适用于.NET,Mac,iOS,Android,Java,Windows Phone,Windows 8,Unity,Xamarin等,甚至还包括对WebRTC音频/视频流的完全支持。