如何修正安卓虚拟机收不到udp包的问题

如何修正安卓虚拟机收不到udp包的问题,第1张

前言

当我们做安卓开发时,大多数人还是习惯用虚拟机,毕竟真机巴拉来巴拉去的不如鼠标方便,尤其是调试一些功能模块时,比如socket udp , 下文说明如何用as+虚拟机调试 socket udp, 实测

如何搭建udp服务器和客户端不提了,简单的搭建随便找一个吧

首先我们的前提是 我们在pc上建立了一个UDP服务器,目的是通过这服务器给虚拟机发送一个udp包

但如何发送这个包呢?

如果想当然的这样做在server上给"127.0.0.1:9014"发送包,然后在虚拟机的9014端口接受包,你会发现无论发多少次,虚拟机什么都收不到。 原因是,你这个包并不是发给虚拟机了,而是发给了本地端口,

也许你会说,给虚拟机发应该用虚拟机的ip地址,好的,通过尝试我们发现给虚拟机的ip地址+9014端口,仍然无法收到。(我用工具查看的虚拟机ip地址是10.0.2.15)

正确步骤

1.把PC端口9014映射到虚拟机,意思就是当PC 9014端口收到udp包,它会转发给虚拟机相应的端口

使用windows程序telnet即可达到映射的目的,(注意Telnet在win10需要开启,可查找怎么开启这个程序)

打开cmd 输入如下命令连接到本地虚拟机

telnet localhost 5554

连接成功后他会提示你输入验证,并告诉你验证码在哪里

解决问题的关键:第一,只建立一个socket用来收发数据,每次点击连接时新建,中间不在新建或close同一端口的socket直到点击断开,这样PC端服务程序解析出的端口就在断开前不会变了,这可以解决前一段提到的两个问题。第二,PC端服务程序要具有解析功能,最好用我提供的。顺带提一下,如果同一个端口的socket在没有close的时候再次新建会出现程序自动退出的现象。

昨天,接同事电话,说帮忙协查一个UDP抓不到包的问题,他描述的问题是A主机通过UDP协议向B主机的10001端口发送syslog报文,结果我们的采集程序flume收不到数据;但是C主机向B主机的10002端口也同样发送syslog报文,同一个flume采集程序却可以正常收到报文。

B主机双网卡分别为:42这个ip,网口是eth0;72这个ip,网口是eth1。

B对外网用的IP是一个134网段的IP。

A主机和C主机均使用134这个网段的IP向B主机发送报文。

示意图如下:

我第一个反应是不是防火墙的问题。登录到主机后,因为是centos7的版本,所以通过防火墙状态查看命令,查看防火墙已经关闭。

继续分析,接着考虑是不是防火墙的问题,所以在接收主机B主机上用tcpdump进行抓包,命令如下:

发现报文没问题,接着加上-vv选项,可以看到解析出来的信息,也正是我们要发送的报文,说明中间网络是没问题的。

nc可以说是网络测试的神器,可以方面的建立监听端口,做服务器;可以做客户端测试服务器。

具体测试步骤如下:

1 把B上的flume监听程序停止,然后在B主机上 运行一下命令:

结果:收不到任何消息!!! 有点吃惊,都可以抓到包了,防火墙也是关闭的为什么收不到那。

不服气,继续用nc,在B主机随便启动一个10009端口:

在A服务器上 通过nc命令连接测试:

输入报文进行测试,仍然收不到报文。

2 看下系统日志,发现没有报错。

进入深深的思考中...

说什么,咱们也不能认怂啊,打电话问了下大师,大师说重启下防火墙吧。

所以第二天一大早联系上同事,继续重启防火墙,发现故障依旧。

接着看下flume启动的监听端口情况:

监听的ip配置为0.0.0.0 ,端口绑定的是10001 ,没问题。

虽然B主机有两块网卡,两个IP,但是我们监听了所有IP啊,谨慎一点,还是把IP配置成抓包抓到的42这个IP,结果故障依旧。

继续在B主机上抓包,发现A主机过来的IP是10网段,C主机过来的IP是134网段,那说明源IP网段不一样,会不会因为网段问题造成的这个问题。

鬼使神差地,用 route -n 看了下路由信息,发现:

10网段的目标IP,用的是eth1 这个网口,但是这个eth1的网口配置的ip是72 ip和A向B发送的目标IP不同,A向B发送的目标Ip为34这个ip。

下面把UDP包的流转过程梳理下:

从B主机(IP:10.x.x.x)向A主机的134.x.x.x 发送UDP报文,UDP报文经过中间的NAT转换后目标IP变成了x.x.x.42 通过网口eth0进入到B主机。

B主机访问10.x.x.x 时候,按照现有的route配置,是通过eth1 网口出去的,如果要是有回包的话,那么接收包的网口eth0和回包的网口eth1 不是同一个网卡!

总觉得不太对,我手工删除老的10.x.x.x 路由,并且添加了下新的路由,新路由走eth0,命令如下:

接着再次测试nc收包情况,却可以收到了,flume也同样可以收到了,至此问题解决。

但是有点想不通,按道理udp报文是不会受到目录路由影响的,有大神知道的,请告知。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12075409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存