TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

接下来了解下TFTP协议内容,

               python简单实现tftp客户端(基于udp)-LMLPHP

1:客户发送和服务端每次通信,都要携带2个字节操作码,这里模式有三种类型,除了文件名其他基本上固定  

    (1)netascii,这是8位的ASCII码形式

    (2)octet,8位源数据类型

    (3)mail这种不在支

2:TFTP支持五种类型的包,根据不同操作不同解析                                

       python简单实现tftp客户端(基于udp)-LMLPHP

3:服务端把数据包发送到客户端,包括这次发送块数据的编号和数据一起发送到:客户端

4:客户端接收到数据,要向服务服务

看代码

 1 from socket import *
 2 import struct
 3 import time
 4 udp_sock = socket(AF_INET,SOCK_DGRAM)  #创建一个socket
 5 #send_data = 0x01612E706E67006f6374657400
 6 ip = ("192.168.1.10",69)
 7 send_data = struct.pack("!H5sb5sb",1,b"a.png",0,b"octet",0)#将数据打包成二进制字符串
 8 udp_sock.sendto(send_data,ip)#向服务器发送请求下载
 9 while True:
10     data,addr = udp_sock.recvfrom(1024)#接收服务端的数据
11     data_len = len(data)
12     send_data = struct.unpack("!HH",data[:4])#把二进制转换成数据
13     if send_data[0] == 3:#3表示服务端发送过来的数据包
14         if send_data[1] == 1:
15             f = open("b.png","wb+")
16         f.write(data[4:])#数据包前4个字节是操作码和块编号,之后的就是实际数据
17         ack_data = struct.pack("!HH",4,send_data[1])#这里的4确认码  send_data[1]是服务端发过来的块编号
18         udp_sock.sendto(ack_data,addr)#向服务发送数据表示确认收到数据
19         if data_len<516:
20             f.close()
21             print("下载完成")
22             break
23     elif send_data[0] == 5:
24         print("下载失败")
25         break
26 udp_sock.close()
02-17 00:06