问题引申:
qnx和android之间通过socket做一些远程调用,一开始android只有一个网络接口eth0,两者通信没有问题。 后来android系统需要做多vlan,eth0依然是0网段的ip,又在eth0基础上虚拟了多个vlan接口,两个系统起来后能正常ping通,走0网段,但是应用侧反应change合入后,双方的socket通信能连接上但是无法正常通信。
最终分析结果:
根据netstat -n命令,发现tcp的连接状态,发现建立连接的两个网段都不一样,这样铁定不能通信的。
经过分析,因为我们qnx系统除了网段0,也创建了个vlan3的3网段;android也有网段0,vlan3的网段3网段,还有其他多个vlan,这样的话,android和qnx系统会有两个网段能通。
默认情况下应该是通过0网段通信,经分析,应该是android作为tcp server,监听any接口, qnx这边网段3先建立,所以qnx的数据走的是3网段,发出了3网段的请求连接,后面再次创建规则0网段优先,所以3网段的。
等会儿再继续想一想
# netstat -n
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 172.20.0.34.30501 172.20.3.36.30491 ESTABLISHED
tcp 0 0 172.20.0.34.30501 *.* LISTEN
tcp 0 0 *.20900 *.* LISTEN
tcp 0 0 *.3490 *.* LISTEN
tcp 0 0 *.2049 *.* LISTEN
tcp 0 0 *.111 *.* LISTEN
tcp 0 0 *.5555 *.* LISTEN
tcp 0 0 *.* *.* CLOSED
tcp 0 0 *.22 *.* LISTEN
tcp 0 0 *.8000 *.* LISTEN
tcp 0 0 *.23 *.* LISTEN
tcp 0 0 *.514 *.* LISTEN
tcp 0 0 *.21 *.* LISTEN
udp 0 0 *.* *.*
udp 0 0 239.255.3.1.30490 *.*
udp 0 0 172.20.3.34.30490 *.*
udp 0 0 *.3490 *.*
udp 0 0 *.2049 *.*
udp 0 0 *.1023 *.*
udp 0 0 *.111 *.*
udp 0 0 *.514 *.*
Active Internet6 connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp6 0 0 *.111 *.* LISTEN
udp6 0 0 *.* *.*
udp6 0 0 *.1023 *.*
udp6 0 0 *.111 *.*
Active UNIX domain sockets
网络连通性首先要看ping是否能够通
具体场景一: 车机双系统qnx和android的连通性测试
qnx系统里有工具iperf、telenet,android系统里有
iperf3、telnet、nc命令(有些命令需要busybox)
测试TCP连通性:
qnx侧作为iperf server,命令:
# iperf2 -s
Server listening on TCP port 5001
TCP window size: 977 KByte (default)
android使用nc连接,命令:
busybox nc -vv 172.20.0.34 5001
172.20.0.34 (172.20.0.34:5001) open
此时server端会打印,
[ 4] local 172.20.0.34 port 5001 connected with 172.20.0.36 port 35161
地方
项目遇到同事说,tcp连接能连通,但是无法传输数据,虽然很费解,但是还是得测一下
qnx只有telent和iperf2能够进行tcp连接
所以在qnx作为iperf2 server,android作为nc/telent client连接server时,在android侧用tcpdum工具抓包,android侧可以输入一些数据,也可以发送server端
130|hqcos:/ # nc -v 172.20.0.34 5001
nc: Unknown option 'v' (see "nc --help")
1|hqcos:/ # busybox nc -v 172.20.0.34 5001
172.20.0.34 (172.20.0.34:5001) open
11
22
33
44
55
99999999
android侧抓一下tcpdump数据:
hqcos:/ # tcpdump -i eth0 -nn -v host 172.20.0.34 -w /data/88.pcap
使用wireshark打开:
截部分图, 发现数据里面带着我们输入的33、44、9999999发送到了server端,说明tcp数据发送也正常
![](https://i-blog.csdnimg.cn/blog_migrate/cedac355b9cb67825c9652a426f52fdc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c037b0871c97c23025322e514e757dea.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a14e718b0047b3b99c1178d4e6781f54.png)
测试UDP连通性:
qnx侧作为udp server
# iperf2 -u -s
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 163 KByte (default)
android使用nc连接,命令:
130|hqcos:/ # busybox nc -v -u 172.20.0.34 5001 172.20.0.34 (172.20.0.34:5001) open
测试TCP连通性的其他方式:
方式一、iperf3/iperf2可以测试tcp的连接
一方作为server,一方作为client来连接,但是iperf3和iperf2不兼容
server:iperf3/iperf2 -s 172.20.0.36
client: iperf3/iperf2 -c 172.20.0.36 -p 端口
https://www.cnblogs.com/linxiu-0925/p/11531446.html
方式二:iperf和telnet
如果一方有iperf3或者iperf2(测试TCP、UDP都可以),另一方有telnet(telnet基于TCP协议)命令
可以一方设置为iperf 的server,比如
iperf3/iperf2 -s 172.20.0.36
另一方(android)用telnet
127|hqcos:/ # busybox telnet 172.20.0.34 5001
Connected to 172.20.0.34
另一方为(qnx)用telnet
# telnet 172.20.0.36 5201
Trying 172.20.0.36...
Connected to 172.20.0.36.
Escape character is '^]'.
有Connected to IP,说明已经TCP连通
方式三、iperf和ssh
一方通过iperf设置为server
另一方通过ssh(TCP协议)来测试连通性
命令:ssh -v ip -p 端口号
在回显中有connection establised表示端口是通的。
![](https://i-blog.csdnimg.cn/blog_migrate/9d796c0a318d285d56c73ea54767c9f7.png)
方式四:nc工具(既可以测试TCP,可以测试UDP)
nc可以用来聊天,传文件,测试网络连通性
我这儿是两边有一个设备没有nc,所以nc作为client,另一侧server用iperf模拟
1|hqcos:/ # busybox nc -v -w 1 172.20.0.34 -z 5001 172.20.0.34 (172.20.0.34:5001) open
#nc -v 110.242.68.66 80
Connection to 110.242.68.66 80 port [tcp/http] succeeded!
聊天
nc还可以作为简单的字符下聊天工具使用,同样的,server2上需要启动监听:
[root@hatest2 tmp]# nc -lp 1234
server1上传输:
[root@hatest1 ~]# nc 192.168.228.222 1234
这样,双方就可以相互交流了。使用Ctrl+D正常退出。
利用nc传文件:
注意这里要记住的是接收文件的是服务器端,发送文件的是客户端:
服务器端命令:
nc -l ip地址 端口号 > 接收的文件名
客户端命令:
nc ip地址 端口号 < 发送的文件名