问题引申:

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数据发送也正常

测试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表示端口是通的。

方式四: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之二:nc命令详解 – 个人运维笔记

聊天
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地址 端口号 < 发送的文件名
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐