Linux客户端和Window服务器端udp socket通信不能成功

Linux客户端和Window服务器端udp socket通信不能成功,第1张

上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。

因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)

另外的可能就是linux客户端上的代码运行机制问题。

首先要100%确定客户端的消息到了服务器端,代码上的表现可能也不同,有没有表示什么时候发完,这一类;

然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数。也就是结束符,服务器可能一直在等单条消息的结束

QQ游戏有很多种类,比如欢乐斗地主、坦克大战、连连看等等游戏。很多用户在工作之余在win7系统电脑上登录QQ游戏大厅玩游戏,发现qq游戏大厅登陆不上,还提示无法进入游戏,还出来一行字:非常抱歉,登录超时,请检查您的网络设置,或稍后再试。这是怎么回事呢?难道是断网了吗?下面小编和大家分享几种原因和解决方法。

推荐:win764位旗舰版下载

具体方法步骤如下:

1、如果是网络都连接不上的话,可能是用户的网络出了问题,查看网线接口是否插好,猫和路由器是否正常工作。路由器等方面设置有没有出错的情况。检测下服务器是否正常。

2、如果是单纯的QQ游戏登陆不上的话,去查看是不是QQ游戏服务器在维护更新的情况,导致QQ游戏暂停开放。进入到腾讯的官网,查询具体开放时间即可。

3、用户的网速太慢,导致网速达不到QQ游戏所需要的最低要求,一般情况下用软件来检测网速,如果网速很卡很慢的话联系开发商协商解决。

4、QQ游戏的程序文件被破坏,这种情况一般是病毒、流氓程序恶意篡改了QQ程序,导致QQ游戏运行不了的情况。解决方法就是将QQ游戏卸载然后在重新安装即可。或者在用杀毒软件对电脑进行查杀病毒,然后查看QQ游戏是否可以正常登陆。

5、还有可能是QQ系统在调整或者用户使用的代理已经失效的原因。这样的话用户尝试更换代理或者不使用代理来登陆,也可以稍后再登陆。

上述就是介绍win7系统qq游戏大厅登陆不上的几种原因和解决方法,如果你们有遇到同样的问题就请参考上面方法进行解决吧,希望大家能够顺利玩游戏。

工作中遇到一个 docker 容器下 UDP 协议网络不通的问题,困扰了很久,也比较有意思,所以想写下来和大家分享。

我们有个应用是基于 UDP 协议的,部署上去发现无法工作,但是换成 TCP 协议是可以的(应用同时支持 UDP、TCP 协议,切换成 TCP 模式发现一切正常)。

虽然换成 TCP 能解决问题,但是我们还是想知道到底 UDP 协议在容器网络模式下为什么会出现这个问题,以防止后面其他 UDP 应用会有异常。

这个问题抽象出来是这样的:如果有 UDP 服务运行在宿主机上(或者运行在网络模型为 host 的容器里),并且监听在 0000 地址(也就是所有的 ip 地址),从运行在 docker bridge(网桥为 docker0) 网络的容器运行客户端访问服务,两者通信有问题。

注意以上的的限制条件,通过测试,我们发现下来几种情况都是正常的:

这个问题在 docker 上也有 issue 记录,但是目前并没有合理的解决方案。

https://githubcom/moby/moby/issues/15127

https://githubcom/iotaledger/iri/issues/961

这篇文章就分析一下出现这个问题的原因,希望给同样遇到这个问题的读者提供些帮助。

这个问题很容易重现,我的实验是在 ubuntu1604 下用 netcat 命令完成的,其他系统应该类似。

在宿主机上通过 nc 监听 56789 端口,然后使用 bridge 网络模式,run 一个容器,在容器里面使用 nc 发数据。

第一个报文是能发送出去的,但是以后的报文虽然在网络上能看到,但是对方无法接收。

在宿主机运行 nc UDP 服务器(-u 表示 UDP 协议,-l 表示监听的端口)

注:默认没有指定绑定ip,就是监听在0000上。

然后在同一宿主机上,启动一个容器,运行客户端:

nc 的通信是双方的,不管对方输入什么字符,回车后对方就能立即收到。

但是在这个模式下,客户端第一次输入对方能够收到,后续的报文对方都收不到。

在这个实验中,容器使用的是 docker 的默认网络,容器的 ip 是 1721703,通过 veth pair(图中没有显示)连接到虚拟网桥 docker0(ip 地址为 1721701),宿主机本身的网络为 eth0,其 ip 地址为 172161313。

遇到这种疑难杂症,第一个想到的抓包。

我们需要在 docker0 上抓包,因为这是报文必经过的地方。

通过过滤容器的 ip 地址,很容器找到感兴趣的报文:

为了模拟多数应用一问一答的通信方式,我们一共发送三个报文,并用 tcpdump 抓取 docker0 接口上的报文:

抓包的结果如下,可以发现第一个报文发送出去没有任何问题。

UDP 是没有 ACK 报文的,所以客户端无法知道对方有没有收到,这里说的没有问题没有看到对应的 ICMP 差错报文。

但是第二个报文从服务端发送的报文,对方会返回一个 ICMP 告诉端口 38908 不可达;第三个报文从客户端发送的报文也是如此。以后的报文情况类似,双方再也无法进行通信了。

而此时主机上 UDP nc 服务器并没有退出,使用 ss -uan | grep 56789 可能看到它仍然在监听着该端口。

从网络报文的分析中可以看到服务端返回的报文源地址不是我们预想的 eth0 地址,而是 docker0 的地址,而客户端直接认为该报文是非法的,返回了 ICMP 的报文给对方。

那么问题的原因也可以分为两个部分:

第一个问题的关键词是:UDP 和多网络接口。

因为如果主机上只有一个网络接口,发出去的报文源地址一定不会有错;而我们也测试过 TCP 协议是能够处理这个问题的。

通过搜索,发现这确实是个已知的问题。

这个问题可以归结为一句话:UDP 在多网卡的情况下,可能会发生服务器端源地址不对的情况,这是内核选路的结果。

为什么 UDP 和 TCP 有不同的选路逻辑呢?

因为 UDP 是无状态的协议,内核不会保存连接双方的信息,因此每次发送的报文都认为是独立的,socket 层每次发送报文默认情况不会指明要使用的源地址,只是说明对方地址。

因此,内核会为要发出去的报文选择一个 ip,这通常都是报文路由要经过的设备 ip 地址。

那么,为什么 dnsmasq 服务没有这个问题呢?

于是我使用 strace 工具抓取了 dnsmasq 和出问题应用的网络 socket 系统调用,来查看它们两个到底有什么区别。

dnsmasq 在启动阶段监听了 UDP 和 TCP 的 54 端口

因为是在本地机器上测试的,为了防止和本地 DNS 监听的DNS端口冲突,我选择了 54 而不是标准的 53 端口:

比起 TCP,UDP 部分少了 listen,但是多个 setsockopt(4, SOL_IP, IP_PKTINFO, [1], 4) 这句。

到底这两点和我们的问题是否有关,先暂时放着,继续看传输报文的部分。

dnsmasq 收包和发包的系统调用,直接使用 recvmsg 和 sendmsg 系统调用:

而出问题的 UDP 应用 strace 结果如下:

其对应的逻辑是这样的:使用 ipv6 绑定在 0000 和 6088 端口,调用 getsockname 获取当前 socket 绑定的端口信息,数据传输过程使用的是 recvfrom 和 sendto。

对比下来,两者的不同有几点:

因为是在传输数据的时候出错的,因此第一个疑点是 sendmsg 和 sendto 的某些区别导致选择源地址有不同,通过 man sendto 可以知道 sendmsg 包含了更多的控制信息在 msghdr。

一个合理的猜测是 msghdr 中包含了内核选择源地址的信息!

通过查找,发现 IP_PKTINFO 这个选项就是让内核在 socket 中保存 IP 报文的信息,当然也包括了报文的源地址和目的地址。 IP_PKTINFO 和 msghdr 的关系可以在这个 stackoverflow 中找到:

https://stackoverflowcom/questions/3062205/setting-the-source-ip-for-a-udp-socket

而 man 7 ip 文档中也说明了 IP_PKTINFO 是怎么控制源地址选择的:

如果 ipi_spec_dst 和 ipi_ifindex 不为空,它们都能作为源地址选择的依据,而不是让内核通过路由决定。

也就是说,通过设置 IP_PKTINFO socket 选项为 1,然后使用 recvmsg 和 sendmsg 传输数据就能保证源地址选择符合我们的期望。

这也是 dnsmasq 使用的方案,而出问题的应用是因为使用了默认的 recvfrom 和 sendto。

为什么内核会把源地址和之前不同的报文丢弃,认为它是非法的?

因为我们前面已经说过,UDP 协议是无连接的,默认情况下 socket 也不会保存双方连接的信息。即使服务端发送报文的源地址有误,只要对方能正常接收并处理,也不会导致网络不通。

但是 conntrack 不是这样,内核的 netfilter 模块会保存连接的状态,并作为防火墙设置的依据。

它保存的 UDP 连接,只是简单记录了主机上本地 ip 和端口,和对端 ip 和端口,并不会保存更多的内容。

关于 这块可参考 intables info 网站的文章:

http://wwwiptablesinfo/en/connection-statehtml#UDPCONNECTIONS

在找到根源之前,我们曾经尝试过用 SNAT 来修改服务端应答报文的源地址,期望能够修复该问题,但是却发现这种方法行不通,为什么呢?

因为 SNAT 是在 netfilter 最后做的,在之前 netfilter 的 conntrack 因为不认识该 connection,直接丢弃了,所以即使添加了 SNAT 也是无法工作的。

那能不能把 conntrack 功能去掉呢?比如解决方案:

答案也是否定的,因为 NAT 需要 conntrack 来做翻译工作,如果去掉 conntrack 等于 SNAT 完全没用。

知道了问题的原因,解决方案也就很容易找到。

nc 可以跟两个参数,分别代表 ip 和 端口,表示服务端监听在某个特定 ip 上。

如果接收到的报文目的地址不是 172161313,也会被内核直接丢弃,这种情况下,服务端和客户端也能正常通信。

docker 容器网络下 UDP 协议的一个问题

https://cizixscom/2017/08/21/docker-udp-issue/

Setting the source IP for a UDP socket

https://stackoverflowcom/questions/3062205/setting-the-source-ip-for-a-udp-socket

LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

https://wwwcnblogscom/kissazi2/p/3158603html

Source IP address selection

https://wwwibmcom/docs/en/zos/210topic=profiletcpip-source-ip-address-selection

UDP recvmsg 返回目的地址和目的接口信息

http://blogchinaunixnet/uid-16813896-id-4593514html

告知你不为人知的 UDP:连接性和负载均衡

https://cloudtencentcom/developer/article/1004554

告知你不为人知的 UDP:疑难杂症和使用

https://cloudtencentcom/developer/article/1004554

相信大家对LOL游戏都比较熟悉了,是一款非常受欢迎的网络游戏,可是Win7专业版系统在玩LOL的时候突然无法登录游戏,提示“无法连接到服务器,您想重新连接吗?”为什么会发生这样的问题,造成这个问题的原因有多种,下面就教大家解决Win7登录lol游戏提示“无法连接到服务器,您想重新连接吗?”的方法。

1、重启电脑,重启电脑能解决许多系统问题,所以如果LOL无法连接服务器是系统问题造成的,那么重启电脑有很大几率解决。

2、检查网络是否正常,首先查看电脑网线接口那是不是亮的并且闪烁,如果不亮或者不闪那说明网络连接有问题,这时用驱动精灵查看网卡驱动是否正常,如果正常则可能是网线、路由器或网络运营商的问题。

3、如果网络正常却无法玩游戏,可以尝试使用网游加速器。

以上教程轻松解决Win7登录lol游戏提示“无法连接到服务器,您想重新连接吗?”的问题,参考上述方法设置,问题就可以轻松解决了。

浩方有时候登不上平台,或者登上了房间速度也是NOPING,西西给大家提供一些方法供参考:

首先,可以下载testping测试下能否连上浩方的登录服务器

如果连不上的话可能病毒或木马的网络劫持,这情况一般可以用机器上的安全软件解决。如果还不行,多半就是网络线路原因了,这个情况只能等待宽带运营商修复了。

如果testping测试能够连得上的话,则可能由于端口被封无法登陆,这情况就要联系网络的管理员开放端口了,建议打开TCP

1201,1202,1203端口

UDP协议打开1024以上的端口。如果端口没问题,那就在网络设置中选择其他登陆服务器多试几次。

ping

1133125194

timeout

ping

221192131161

---->

266

ms

ping

222732344

---->

47

ms

----

end

of

ping

----

比如第一个显示timeout,这个是不行了。

第二个266ms,这个可能会慢

第三个47ms,这个很不错了。

如果使用盛大通行证登录,提示“你被禁止登录平台”,请尝试登录http://wwwsdocom,如果也不能登录,说明你所使用的盛大通行证被盛大禁止登录(浩方当然也不能登录了),请联系盛大客服,询问解决方法。

另外,请不要在短时间内反复登录(尤其是密码错误时反复尝试),这可能会导致你所在的IP段被禁止登录一段时间。

望采纳谢谢,实在不行就打电话给网络运营商叫他们来修。

如果出现“UDP不通”的问题,首先请选择合适的网络环境进行游戏(网通的玩家请进入网通专区,电信的玩家请进入电信专区)。”

若仍出现该提示,您可以通过以下方法解决:

请检查您是否同时进入了两个以上的“QQ雷电”房间,如果有,请退出多余房间,只进入一个。

如果没有,请检查您的网络防火墙,或者UDP通讯端口被封闭而导致无法进行游戏,请检查您的网络配置。或向您的网络管理员咨询是否有对UDP端口进行限制。

如果依然不能进行游戏,请耐心等待游戏版本的更新,我们会在后续的版本中解决此问题

游戏尚在测试阶段,对于给您带来的不便,深表歉意!感谢您对QQ游戏的支持

如果还是运行不成 请重新下载游戏!

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Linux客户端和Window服务器端udp socket通信不能成功

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情