问题引申:
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系统里有工具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数据发送也正常
测试UDP连通性:
一方作为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
如果一方有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设置为server
另一方通过ssh(TCP协议)来测试连通性
命令:ssh -v ip -p 端口号 在回显中有connection establised表示端口是通的。
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地址 端口号 > 接收的文件名 客户端命令: