TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。端口號爲69。服務器
接下來了解下TFTP協議內容,socket
1:客戶發送和服務端每次通訊,都要攜帶2個字節操做碼(包的類型),spa
2:模式有三種類型,除了文件名其餘基本上固定 code
(1)netascii,這是8位的ASCII碼形式blog
(2)octet,8位源數據類型ip
(3)mail這種不在支ci
3:TFTP支持五種類型的包,根據不一樣操做不一樣解析 字符串
4:服務端把數據包發送到客戶端,包括此次發送塊數據的編號和數據一塊兒發送到:客戶端it
5:客戶端接收到數據,要向服務服務class
看代碼
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()