TFTP(Trivial File Transfer Protocol, 简单文件传输协议) 是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议, 提供不复杂, 开销不大的文件传输服务. 端口号为 69.
接下来了解下 TFTP 协议内容,
1: 客户发送和服务端每次通信, 都要携带 2 个字节操作码, 这里模式有三种类型, 除了文件名其他基本上固定
(1)netascii, 这是 8 位的 ASCII 码形式
(2)octet,8 位源数据类型
(3)mail 这种不在支
2:TFTP 支持五种类型的包, 根据不同操作不同解析
3: 服务端把数据包发送到客户端, 包括这次发送块数据的编号和数据一起发送到: 客户端
4: 客户端接收到数据, 要向服务服务
看代码
- from socket import *
- import struct
- import time
- udp_sock = socket(AF_INET,SOCK_DGRAM) #创建一个 socket
- #send_data = 0x01612E706E67006f6374657400
- ip = ("192.168.1.10",69)
- send_data = struct.pack("!H5sb5sb",1,b"a.png",0,b"octet",0)# 将数据打包成二进制字符串
- udp_sock.sendto(send_data,ip)# 向服务器发送请求下载
- while True:
- data,addr = udp_sock.recvfrom(1024)# 接收服务端的数据
- data_len = len(data)
- send_data = struct.unpack("!HH",data[:4])# 把二进制转换成数据
- if send_data[0] == 3:#3 表示服务端发送过来的数据包
- if send_data[1] == 1:
- f = open("b.png","wb+")
- f.write(data[4:])# 数据包前 4 个字节是操作码和块编号, 之后的就是实际数据
- ack_data = struct.pack("!HH",4,send_data[1])# 这里的 4 确认码 send_data[1] 是服务端发过来的块编号
- udp_sock.sendto(ack_data,addr)# 向服务发送数据表示确认收到数据
- if data_len<516:
- f.close()
- print("下载完成")
- break
- elif send_data[0] == 5:
- print("下载失败")
- break
- udp_sock.close()
来源: https://www.cnblogs.com/zz-952/p/10388686.html