C# Socket 如何获得客户端的NAT IP和端口号?

BusyDonkey 2011-06-28 10:23:54
如果客户端A在路由器下的局域网中,服务器B在公网上,
如果A使用TCP或UDP向B发送一个消息,那么用B的Socket.RemoteEndPoint读取到的是A所在路由器的NAT IP和端口号吗?
如果不是B怎么读取到A的NAT IP和端口号?
...全文
1454 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
江湖评谈 2013-11-04
  • 打赏
  • 举报
回复
  受益匪浅,多谢楼主总结。
rockmanhqu 2013-02-19
  • 打赏
  • 举报
回复
引用 15 楼 rockmanhqu 的回复:
这种方式取得的NAT的外网IP是错的。 我是这么测试的, 一台内网NAT的下的PC(楼主所说的A), 向两台公网的服务器发包(TCP UDP), 两台服务器中得到的A的外网IP竟然不一样。 后面我去查了一下路由器当前的公网IP, 也不等于这两次测试结果的公网IP。 如果得到A的公网IP,本人进一步研究中。 也请高手支持一下, 顶一下贴。 谢谢!
很奇怪的是, 有的服务器产生的是对的。
rockmanhqu 2013-02-19
  • 打赏
  • 举报
回复
这种方式取得的NAT的外网IP是错的。 我是这么测试的, 一台内网NAT的下的PC(楼主所说的A), 向两台公网的服务器发包(TCP UDP), 两台服务器中得到的A的外网IP竟然不一样。 后面我去查了一下路由器当前的公网IP, 也不等于这两次测试结果的公网IP。 如果得到A的公网IP,本人进一步研究中。 也请高手支持一下, 顶一下贴。 谢谢!
BusyDonkey 2011-07-01
  • 打赏
  • 举报
回复
最后归纳一下,以便日后查询:

如果客户端A在路由器下的局域网中,服务器B在公网上

如果A使用TCP或UDP向B发送一个消息,那么A所在的路由器会先将消息中的源地址由“A的内网IP和端口号”替换为“NAT IP和端口号”(即A的外网IP和端口号,其中外网IP就是路由器的外网IP,而端口号则是由路由器为A自动分配的,另外如10楼那位大哥所说路由器分配的NAT端口号在每次会话时有可能会发生改变,详情请见链接:NAT路由器打洞原理 中NAT的四种类型部分),那么用B收到A发送来的消息后,使用Socket.RemoteEndPoint读取到的是A所在路由器的NAT IP和端口号(即A的外网IP和端口号),如果B要想发送消息给A,也只能先将消息发送给A所在路由器的NAT IP和端口号(即A的外网IP和端口号),待A所在的路由器收到B发送过来的消息后,路由器会将消息中的目的地址由“NAT IP和端口号”映射为“A的内网IP和端口号”,再将此消息转发给A。


另外找到了个类似的CSDN帖子,请看帖子中的3楼和4楼:
http://topic.csdn.net/u/20101205/14/3571a3f8-15aa-4ab8-86ae-6e2f0d5610e3.html


另外5楼那位大哥发的链接也很有用,是讲的“用C#编写获取远程IP,MAC的方法”,需要时可以参考下


关于NAT路由器打洞的详细原理和流程,请见参考文献:NAT路由器打洞原理 同时也可以查考:13楼那位大哥给出的连接

此外我在11楼问的问题可以无视了,因为NAT端口变不变和协议面不面向连接无关,这个问题还是请看文献:NAT路由器打洞原理中NAT的四种类型部分


萨拉嘿 2011-06-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/oONukeOo/archive/2010/10/15/5942441.aspx
参考
萨拉嘿 2011-06-30
  • 打赏
  • 举报
回复
使用UDP协议 Symmetric NAT下端口也会改变
客户端与服务器的通信 需要客户端首先发起 也就是向服务器发送信息 建立一个通路 也就是"洞" 客户端才能成功接收服务器发送的信息 如由服务器直接发信息给客户端(客户端未发送过信息给服务器) 则服务器发送的信息将会被客户端抛弃
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 busydonkey 的回复:]
试不了啊......不能同时用路由器又同时接猫....
[/Quote]

再找个路由器呗。不然你安装虚拟机,设置虚拟机为NAT网络方式也可以用来测试。
BusyDonkey 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sp1234 的回复:]
开始“试一下”呗!

实际上你编程时,把它就当作变动的,不用考虑不变,这就不就以万变应付不变了嘛。
[/Quote]

我的网络实在是试不了啊,当下也不知道怎么配置虚拟机。。。。。
如果A的NAT 端口号一直在变动,服务器B想要给A回发消息,岂不是A就收不到了?
萨拉嘿 2011-06-29
  • 打赏
  • 举报
回复
是A所在路由器的NAT IP和端口号 每次连接端口号都会改变 IP不变
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 busydonkey 的回复:]

另外我还想问下各位大神,如果服务器B也想发消息给客户机A,那么是不是B必须先从A发过来的消息中获取到A的NAT IP和端口号,然后B把消息发送到A的NAT IP和端口号,A所在路由器收到B发送过来的消息后再转发给A?
[/Quote]

你可以找一个NAT路由“打洞”的资料看看。

关于前一个端口问题,其实不同的设备会有不同的处理。有的不变,有的每一次都变。
  • 打赏
  • 举报
回复
开始“试一下”呗!

实际上你编程时,把它就当作变动的,不用考虑不变,这就不就以万变应付不变了嘛。
BusyDonkey 2011-06-29
  • 打赏
  • 举报
回复
另外我还想问下各位大神,如果服务器B也想发消息给客户机A,那么是不是B必须先从A发过来的消息中获取到A的NAT IP和端口号,然后B把消息发送到A的NAT IP和端口号,A所在路由器收到B发送过来的消息后再转发给A?
BusyDonkey 2011-06-29
  • 打赏
  • 举报
回复
试不了啊......不能同时用路由器又同时接猫....
BusyDonkey 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oonukeoo 的回复:]
是A所在路由器的NAT IP和端口号 每次连接端口号都会改变 IP不变
[/Quote]
请问:每次连接端口号都会改变 IP不变,是指的A使用面向连接的协议(比如tcp)建立连接时端口号会改变吗?
如果A使用的时UDP协议那么NAT端口号会改变吗?
hhc123 2011-06-29
  • 打赏
  • 举报
回复
你试一下不就知道了吗?
BusyDonkey 2011-06-29
  • 打赏
  • 举报
回复
自己先顶下

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧