自己编写代码与UDP模拟软件交互详解

环境说明

windows 10 x64(这个应该问题不大)

python实现

以阶段一的两台设备为例

打开两个模拟软件,软件1选择设备1接口0,软件2选择设备2接口0,然后分别点击重载参数来获取参数,效果如图

DoIFm9P6JYu34Uf.png

随后两边都点击接通连路,并测试连通性,试着传输几个数据,发现效果不错

oSmERIK8CkX2qvd.png

端口解释

kJjOmx2SZfbdgvw.png

关系说明

举个简单的类比大家就知道了

上层端口控制物理层,就如同老板跑腿的的关系,跑腿的并不处理信息而是只负责传输软件上写的对方端口就是告诉跑腿的要传到哪儿

举个例子,软件1的上层端口要发送11111111给软件2,然后上层端口就把这个信息交给软件1物理层本地端口11100,然后对方端口设置的是12100,物理层就只需要把这个交给12100也就是软件2的物理层就完事儿了。

软件2的物理层接收到了这个消息之后立马报告给老板,也就是物理层2的上层端口12400

至此,信息的发送就完成了。

什么?软件1怎么知道软件2有没有收到包?模拟软件的名字都写了,这是UDP发包,不管那么多的。

python 实现

也就是说我们有2个上层端口,两个相连通的物理端口,OK,也就是说我们需要两个程序来分别绑定两个上层端口

软件1

1
2
3
4
5
6
7
8
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#指定UDP传输模式
ipPort1 = ('127.0.0.1',11400)#绑定软件1的上层端口
sk.bind(ipPort1)
localIpPort1 = ('127.0.0.1',11100)
content = b'1111111111111111'
print('start to send...')
sk.sendto(content,localIpPort1)#给本地端口11100发送content的字符串

软件2

1
2
3
4
5
6
7
8
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#指定UDP传输模式
ipPort2 = ('127.0.0.1',12400)
localIpPort2 = ('127.0.0.1',12100)
sk.bind(ipPort2)
print('start to recv...')
hexdata = eval('0x'+bytes.hex(sk.recv(1024)))#接收到的字符串转化为二进制并打印
print(bin(hexdata)[2:])

分别保存为1.py2.py然后在powershell中运行(这是我写套接字比较喜欢的运行方式,你也可以在cmd和其他环境下运行,问题不大) ,运行截图如下

k6wOoxjmD3TJsve.png

分别截图

pueVnBQi9KhJqgD.png

cFZexh8m1A4vHJo.png

看样子似乎比较成功获取了软件1发送给软件2的消息,而且我们看下面的状态信息

uIG9Jgn1tVPfObw.png

至此我们成功通过软件的方式实现了操控UDP发包的过程

我们再从软件2给软件1发消息试试,这个时候我们临时写的python就要改一下了,而且,比特之间的传输已经证明是可行的了,我们搞♂点新兄弟

软件1

1
2
3
4
5
6
7
8
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ipPort1 = ('127.0.0.1',11400)
sk.bind(ipPort1)
localIpPort1 = ('127.0.0.1',11100)
print('start to recv...')
recvdata = sk.recv(1024).decode('utf-8')
print(recvdata)

软件2

1
2
3
4
5
6
7
8
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ipPort2 = ('127.0.0.1',12400)
localIpPort2 = ('127.0.0.1',12100)
sk.bind(ipPort2)
content = 'Deep dark fantasy'
print('start to send...')
sk.sendto(content.encode('utf-8'),localIpPort2)

然后在powershell中先运行1.py,然后在另一个powershell中运行2.py,截图如下

zl8vbgMpoIU9fSu.png

模拟端口截图如下

aorvOmGubTknPeS.png

接收端出现的乱码正是因为还没有进行帧定位的结果,这个就是后话了。

后面还想到了一些很有趣的玩法,比如把软件1的对方地址直接填写到软件2的上层地址上面,具体实现过程就不表了。

in3aoC5GsKytSfd.png

果然,也能收到,这就相当于是软件1的跑腿的直接给软件2的老板送信,自然软件2的老板能收到信息了。

完结撒花(●ˇ∀ˇ●)