C# Socket编程如何获取连接的远程客户端的IP地址和端口

GIS小天 2015-06-29 05:21:20
最近做C#Socket编程时遇到了一个非常奇怪的问题,我在A市,用了一个第三方做端口映射的软件成功实现了跨局域网进行TCP通信的问题,也就是我的办公室的电脑作为服务器,我的内网IP为172.23.21.168,端口号为51888,并用第三方软件做了端口映射,将端口映射为31669,将客户端程序发给我一个在另一个城市B市的朋友(他也处在办公室的网络中 )帮我测试,他用客户端程序已经成功连接到了我的服务器,并可以成功跟我进行通信(打字聊天信息双方都能接收和发送)。现在问题来了,我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号,请问这是什么原因造成的?为何双方能成功进行跨网段通信,但是却无法获取他的IP地址,求大神指点下。
...全文
9632 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35959989 2016-09-18
  • 打赏
  • 举报
回复
把你写的程序发给我看一下
小猪八Q 2015-08-13
  • 打赏
  • 举报
回复
引用 5 楼 tianchounh 的回复:
[quote=引用 4 楼 ajianchina 的回复:] [quote=引用 3 楼 tianchounh 的回复:] 还是不明白,没说到点上吧,我问的是为什么我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号。
先看一个过程: 请求数据包从客户机IP出发,去往你们公司公网IP 包到达防火墙 防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。 包离开防火墙向你办公室的电脑内网IP前进 包到达内网IP,你的办公室电脑就会通过防火墙给以回应,一般情况下,防火墙就是你办公室电脑的缺省网关。 好了,因为来自Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达你办公室电脑,所以你的办公室电脑就认为包是防火墙发来的,而不知道真正的源头是其他的IP,所以再怎么socket.RemoteEndPoint都是“然并卵”![/quote] 既然我能通过第三方端口映射的软件实现跨局域网通信,请问用什么办法能获取客户端的IP和端口号呢?如果不用socket.RemoteEndPoint的话。[/quote] 这种情况,可以自己附加相关数据进去,写到数据区
ajianchina 2015-07-01
  • 打赏
  • 举报
回复
引用 3 楼 tianchounh 的回复:
还是不明白,没说到点上吧,我问的是为什么我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号。
先看一个过程: 请求数据包从客户机IP出发,去往你们公司公网IP 包到达防火墙 防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。 包离开防火墙向你办公室的电脑内网IP前进 包到达内网IP,你的办公室电脑就会通过防火墙给以回应,一般情况下,防火墙就是你办公室电脑的缺省网关。 好了,因为来自Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达你办公室电脑,所以你的办公室电脑就认为包是防火墙发来的,而不知道真正的源头是其他的IP,所以再怎么socket.RemoteEndPoint都是“然并卵”!
GIS小天 2015-07-01
  • 打赏
  • 举报
回复
引用 4 楼 ajianchina 的回复:
[quote=引用 3 楼 tianchounh 的回复:] 还是不明白,没说到点上吧,我问的是为什么我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号。
先看一个过程: 请求数据包从客户机IP出发,去往你们公司公网IP 包到达防火墙 防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。 包离开防火墙向你办公室的电脑内网IP前进 包到达内网IP,你的办公室电脑就会通过防火墙给以回应,一般情况下,防火墙就是你办公室电脑的缺省网关。 好了,因为来自Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达你办公室电脑,所以你的办公室电脑就认为包是防火墙发来的,而不知道真正的源头是其他的IP,所以再怎么socket.RemoteEndPoint都是“然并卵”![/quote] 既然我能通过第三方端口映射的软件实现跨局域网通信,请问用什么办法能获取客户端的IP和端口号呢?如果不用socket.RemoteEndPoint的话。
ajianchina 2015-07-01
  • 打赏
  • 举报
回复
引用 5 楼 tianchounh 的回复:
[quote=引用 4 楼 ajianchina 的回复:] [quote=引用 3 楼 tianchounh 的回复:] 还是不明白,没说到点上吧,我问的是为什么我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号。
先看一个过程: 请求数据包从客户机IP出发,去往你们公司公网IP 包到达防火墙 防火墙DNAT(也就是转发)这个包,而且包会经过很多其他的链检验及处理。 包离开防火墙向你办公室的电脑内网IP前进 包到达内网IP,你的办公室电脑就会通过防火墙给以回应,一般情况下,防火墙就是你办公室电脑的缺省网关。 好了,因为来自Internet包在防火墙内先后经过了DNAT和SNAT处理,才能到达你办公室电脑,所以你的办公室电脑就认为包是防火墙发来的,而不知道真正的源头是其他的IP,所以再怎么socket.RemoteEndPoint都是“然并卵”![/quote] 既然我能通过第三方端口映射的软件实现跨局域网通信,请问用什么办法能获取客户端的IP和端口号呢?如果不用socket.RemoteEndPoint的话。[/quote] 你NAT设置之后,RemoteEndPoint取的是经SNAT(已经重写了源IP地址)后的包,如果情况允许的话,你可以将你的电脑设置成DMZ,不知道你的电脑是不是自己工作时用的,这样的设置会导致端口全部暴露在外,如果是单独放在你办公室,并且仅作服务之用,那么你可以做一下IP安全策略,仅开放服务所需的端口。同时需要注意的是,DMZ前防火墙不要有雷同端口的NAT设置,因为NAT优先权高于DMZ,局部DMZ也高于全局DMZ。NAT的区别就在于DMZ是一个区域,而NAT可以理解为是一种协议。除此之外,当然也有其他选择,如NAT穿透(常称为打洞)或者使用隧道,但这些方法常需要借助已知的部署在公网环境下的服务器,采用这类方法,你还不如找个公网环境来进行部署了。
GIS小天 2015-06-30
  • 打赏
  • 举报
回复
还是不明白,没说到点上吧,我问的是为什么我用C#里的socket.RemoteEndPoint想获取他的IP和端口,可是得到的IP竟然是我的内网的IP地址为172.23.21.168,端口号是另外一个为23489的号。
ajianchina 2015-06-29
  • 打赏
  • 举报
回复
我来详细跟你讲讲原因: 知道自己设了一个NAT,可能不知道什么是SNAT和DNAT SNAT: 是设置内网的设备经过防火器(路由器等)接入到互联网时,按内网设备的不同IP地址、对应选择不同的外网接口。即根据源IP地址在网络出口进行对应设置。 DNAT: 是设置外网(互联网)用户访问-->我们防火墙的外网IP所提供的服务(http ssh ftp等)时,将防火墙外网IP提供的服务映射回防火墙的DMZ服务器或者内网服务器。 DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的。 说了那么多不知道你有没有理解,总结一点就是DNAT才能看到请求端IP地址。还有一点,如上楼所说,NAT后的通信效率会受到很大影响,除非不得已,否则得不偿失。
  • 打赏
  • 举报
回复
(所谓)端口影射的软件知道对方的IP,但是他只能自己再封装一个消息给你的服务(此时使用客户端口23489),你并没有直接收到朋友的消息。 这类软件其实根本不是路由器的“端口影射”,它也是通过公网上别的服务器做消息中转的,效率和稳定性不高。用来看网页还凑合。 尽量自己部署服务器去提供有关各方的系统直接联网使用,不要固步自封地只把服务器放在自己的局域网内。其实这种“端口影射软件”是破坏安全和降低性能的,并没有多大意义。只是因为小公司的内部管理人员不了解、惧怕内部人员上网,结果反而还是把自己给出卖到外网上了。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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