苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 7667|回复: 8

[其他] socket udp 外网 问题,飞哥来看下

[复制链接]
发表于 2013-11-26 11:50:26 | 显示全部楼层 |阅读模式
udp 客户端与服务器通信问题,主要实现在线人数及时推送给各个在线使用的用户,内网里面使用无任何问题,到外网客户端接受不到服务器发送的udp协议,我主要实现思路是,先通过客户端连接到服务器端(客户端发送连接请求时,如果使用的是内网ip地址,经过nat运算会转换成外网地址(问题就出在这里)),服务器端接受到客户端的连接然后 myClientSocket.RemoteEndPoint把客户端的ip地址保存,以便推送在线人数。问题来了,服务器端接收到的ip地址(服务器端接收的都是外网ip),然后根据ip地址循环发送个在线用户,但是客户端要接收不了服务器端发送的udp协议的数据。客户端udpclientSocket.Bind(PublicSource.lo.clientSocket.LocalEndPoint)的是本地的ip地址(本地ip地址,如果是内网用户就接受不到服务端发送的信息)。具体代码如下服务端
[C#] 纯文本查看 复制代码
  foreach (KeyValuePair<IPEndPoint, string> cs in server.ClientSockets)
                    {
                        server.udpSocket.SendTo(Encoding.ASCII.GetBytes(string.Format("e*{0}*ol*{1}#", myClientSocket.RemoteEndPoint, server.ClientSockets.Count)), cs.Key);
                    }


客户端
[C#] 纯文本查看 复制代码
 if (udpclientSocket.IsBound)
            {
                udpclientSocket.Close();
                udpclientSocket = new Socket(AddressFamily.InterNetwork,
                                    SocketType.Dgram, ProtocolType.Udp);
            }
            udpclientSocket.Bind(PublicSource.lo.clientSocket.LocalEndPoint);//
            connectThread = new Thread(ListenClient);
            connectThread.Start();



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-26 12:55:27 | 显示全部楼层
是不是应该客户端定时去询问服务器上有没有信息,而不能让服务器主动给客户端。外网点对点没实现过,可以SosoQQ是怎么实现的
 楼主| 发表于 2013-11-26 14:52:49 | 显示全部楼层
站长苏飞 发表于 2013-11-26 12:55
是不是应该客户端定时去询问服务器上有没有信息,而不能让服务器主动给客户端。外网点对点没实现过,可以So ...

不是的。客户端只有第一次与服务器建立链接,后面就是服务器端循环的发送已保存客户的ip地址和端口号在线人数(比如有现在有一个客户端登陆,就执行一遍)。问题是内网可以实现服务端udp发送信息给客户端 。挂到服务器上外网通信就不可以了。怎么解决?
发表于 2013-11-26 14:57:39 | 显示全部楼层
那是因为客户端不是外网吧,也就是说你要跟一个外网IP里面的内网IP通信,这种问题,可以参考QQ的,就是客户端主动的方法,因为服务器端基本上无法确定客户端的Ip。因为他是内网。
 楼主| 发表于 2013-11-26 15:21:04 | 显示全部楼层
站长苏飞 发表于 2013-11-26 14:57
那是因为客户端不是外网吧,也就是说你要跟一个外网IP里面的内网IP通信,这种问题,可以参考QQ的,就是客户 ...

恩第一次我就是主动请求的服务器。然后服务端保存了客户端根据nat得到的外网地址。后面就是发送给这个保存的地址。但是客户端udp绑定的是本地地址也就是内网地址。问题就出现在为什么服务端向那个客户端访问转换成外网的地址发送信息,客户端为什么接收不到?还有对nat不太懂
 楼主| 发表于 2013-11-28 12:38:41 | 显示全部楼层
站长苏飞 发表于 2013-11-26 14:57
那是因为客户端不是外网吧,也就是说你要跟一个外网IP里面的内网IP通信,这种问题,可以参考QQ的,就是客户 ...

飞哥有没解决方案?
发表于 2013-11-28 13:15:28 | 显示全部楼层
flychen 发表于 2013-11-28 12:38
飞哥有没解决方案?

我上面和你说 了,这种方法从理论上就不通,客户端访问你是肯定能访问的,因为他对外是一个公用的外网IP,如果你对他就不行因为你只能记录到他的外网IP,无法识别到内网IP,如果这都能那还分什么内网外网啊,理论上就不通,也不可能实现
你还是研究下我跟你说的方式吧,都是中转的方法。都请求服务器达到通信的。客户端是不端访问服务器得到的结果,QQ也是这样
 楼主| 发表于 2013-11-28 19:48:57 | 显示全部楼层
站长苏飞 发表于 2013-11-28 13:15
我上面和你说 了,这种方法从理论上就不通,客户端访问你是肯定能访问的,因为他对外是一个公用的外网IP ...

好,我研究下,有成果在发贴分享。。
发表于 2013-11-28 20:13:48 | 显示全部楼层
好的,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-29 21:26

© 2014-2021

快速回复 返回顶部 返回列表