UDP 外网 聊天问题

juehzao001 2015-11-19 05:38:44
我现在是这样的流程:客户端登录我的服务端后 我存储了客户端的ip 聊天模块用的是udp ,客户端用udpclient 监听.比如UdpClient udpLocalClient = new UdpClient(new IPEndPoint(IPAddress.Any, 4000)); 一个客户端发消息给另一个客户端时 服务端拿到另一个客户端的ip 往4000端口发送udp消息,测试时服务端在局域网中是可以的,但是服务器放到外网后就不行了.调试发现服务端存储的ip是同一个..不知道我的流程有问题还是什么 ,我应该怎么修改呢???谢谢
...全文
265 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Forty2 2015-11-20
  • 打赏
  • 举报
回复
引用 5 楼 Forty2 的回复:
客户需要绑定到具体地址。
更正: 客户需要绑定到具体地址。
Forty2 2015-11-20
  • 打赏
  • 举报
回复
UDP的话可以用: UdpClient udpLocalClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); 客户需要绑定到具体地址。只要客户先发送消息(可以是空消息)到服务器,服务器可以知道并记录知道客户的公网地址(那个ref remoteEndPoint)。后续的聊天信息就发到该地址。 大部分的NAT/Gateway都会记住UDP的外向通讯,并在一定时间内(比如2分钟),允许外部的回复原路返回。 因此,只要客户保持隔一段时间向服务器发信息,外部服务器就可以据此发信息给客户(这也是所谓的UDP打洞的基本原理)。
Poopaye 2015-11-20
  • 打赏
  • 举报
回复
进到你路由器的管理界面,找到端口映射,顺便百度一下这个要怎么设置
juehzao001 2015-11-20
  • 打赏
  • 举报
回复
可能我表述的不是很清楚,,,,我的两个客户端都在同一个路由器下,服务端收到的ipendpoint 都是同一个ip(应该是路由器的), ..搞不明白服务器如何发送到内网中的一个客户端
  • 打赏
  • 举报
回复
引用 楼主 juehzao001 的回复:
测试时服务端在局域网中是可以的,但是服务器放到外网后就不行了.调试发现服务端存储的ip是同一个
这是网络基本的道理,大部分网络都在 NAT 路由器内部,例如一个公司有一个路由器,一个大厦的一层有一个路由器,一个大厦有一个路由器,一个小区有一个路由器.......当通讯消息通过互联网到达你的公网服务器时,中间有这n层路由,而你只能得到最外层的NAT路由器的IP。 所以如果以为每一一个客户端的IP都不同,则是错误的。
juehzao001 2015-11-20
  • 打赏
  • 举报
回复
不好意思,怎么让你们吵起来了....大家能帮小弟 ,小弟都很感激..
本拉灯 2015-11-20
  • 打赏
  • 举报
回复
引用 11 楼 Forty2 的回复:
[quote=引用 10 楼 wyd1520 的回复:] 废话么。。
如果让你难堪了,我很遗憾。 不过最好认真考虑我的建议 - 做学问的态度和方式,将直接影响我们以后可以达到的技术水平。 [/quote] 很好国家需要你这种态度,,好,支持,威武,有希望了。小弟我甘拜下风。这贴给你发挥吧。
Forty2 2015-11-20
  • 打赏
  • 举报
回复
引用 10 楼 wyd1520 的回复:
废话么。。
如果让你难堪了,我很遗憾。 不过最好认真考虑我的建议 - 做学问的态度和方式,将直接影响我们以后可以达到的技术水平。
本拉灯 2015-11-20
  • 打赏
  • 举报
回复
引用 9 楼 Forty2 的回复:
[quote=引用 8 楼 wyd1520 的回复:] UDP打洞 穿透NAT ...
引用别人的文章,就要归功于别人。建议你以后贴文时注明出处(即使找不到原始出处,你也可以把用的网页引用出来)。 搜索可以找到好些个链接,以下是一个2011年的帖子: http://www.cnblogs.com/my_life/articles/1969605.html[/quote] 废话么。。我又没说原创这类的。还注明出处,纯没事找事。装X。。
Forty2 2015-11-20
  • 打赏
  • 举报
回复
引用 8 楼 wyd1520 的回复:
UDP打洞 穿透NAT ...
引用别人的文章,就要归功于别人。建议你以后贴文时注明出处(即使找不到原始出处,你也可以把用的网页引用出来)。 搜索可以找到好些个链接,以下是一个2011年的帖子: http://www.cnblogs.com/my_life/articles/1969605.html
本拉灯 2015-11-20
  • 打赏
  • 举报
回复
UDP打洞 穿透NAT 最近要做一个即时通工具,主要是要完成与WEB系统、手机系统之间的一个自定义链接功能,能够有效的提高办公效率,可以自主在即时通上开发一系列的定制功能。当然,在开发中也遇到了一些问题,首先就是关于穿透NAT的问题。 其实UDP的打洞还是十分简单,那么UDP的打洞要适用于哪些环境呢? 比如说:用户A和用户B以及服务器A。 服务器A是架设在公网上,他的IP是192.168.180.1。 用户A是在自己的路由下面,他的内网IP是1.1.1.1,端口是1111,通过NAT出去之后,公网IP是2.2.2.2,端口是2222。 用户B也是在自己的路由下面,他的内网IP是10.10.10.10,端口是1010,通过NAT出去之后,公网IP是20.20.20.20,端口是2020。 那么如果用户A和用户B之间要进行点对点的通讯,出现了这种情况应该怎么办呢?用户A和用户B之间能之间点对点聊天么?用户A给用户B发送消息,用户B是收不到的,除非在用户A发送之后,用户B在给用户A发送一条消息,这个时候双方才能进行点对点的通讯。也就是双发需要给各自发送一条消息之后才能建立起点对点的连接,也就是UDP打洞。 那么实现步骤就比较简单了: 1.客户A打开与客户B的聊天窗口,发送一个空包告诉服务器A,客户A与客户B需要聊天,同时发送一个空包给客户B,打通A到B之间的洞。 2.服务器A接受到客户A的信息,发送一个空包告诉客户B,客户A要和你聊天。 3.客户B接受到服务器A的通知,发送一个空包给客户A,打通B到A之间的洞,然后同时发送一个空包给服务器A,通知打洞成功。 4.服务器A接受到客户B的打洞成功的通知,发送一个成功的通知给客户A,这个时候客户A与客户B之间就建立起了点对对的UDP连接。 其实实现起来还是比较简单的,但是关键要注意以下几点: 1.测试的时候,客户A与客户B不能在同一个网关下测试,打洞使用的均是公网IP和端口。 2.在同一个网关下,UDP可以穿透VLAN,所以可以判断两个客户的网关,如果是在同一个网关下,也就是在同一个公网IP下,就可以直接进行点对点的内网IP的连接,不需要打洞。 3.服务器A应该使用同一个UDP连接进行通讯。
juehzao001 2015-11-20
  • 打赏
  • 举报
回复
引用 5 楼 Forty2 的回复:
UDP的话可以用: UdpClient udpLocalClient = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); 客户需要绑定到具体地址。只要客户先发送消息(可以是空消息)到服务器,服务器可以知道并记录知道客户的公网地址(那个ref remoteEndPoint)。后续的聊天信息就发到该地址。 大部分的NAT/Gateway都会记住UDP的外向通讯,并在一定时间内(比如2分钟),允许外部的回复原路返回。 因此,只要客户保持隔一段时间向服务器发信息,外部服务器就可以据此发信息给客户(这也是所谓的UDP打洞的基本原理)。
谢谢.我试了这样子,我在服务端中把(ref remoteEndPoint)终结点存起来,然后比如群聊 我根据这些终结点分别发送udp消息,还是不可以呢..客户端IPEndPoint endLocalPoint = new IPEndPoint(IPAddress.Any, 0); UdpClient udpLocalClient = new UdpClient(endLocalPoint); 是绑定的这个终结点 ,我两个客户端在同一个内网中..
为轮子而生 2015-11-19
  • 打赏
  • 举报
回复
客户端先访问服务器,打洞
crystal_lz 2015-11-19
  • 打赏
  • 举报
回复
难道你你为 外网能访问到你内网的 192.168.xxx之内的IP?

111,119

社区成员

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

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

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