python簡單實現tftp客戶端(基於udp)
TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議)是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不復雜、開銷不大的檔案傳輸服務。埠號為69。
接下來了解下TFTP協議內容,
1:客戶傳送和服務端每次通訊,都要攜帶2個位元組操作碼,這裡模式有三種類型,除了檔名其他基本上固定
(1)netascii,這是8位的ASCII碼形式
(2)octet,8位源資料型別
(3)mail這種不在支
2:TFTP支援五種型別的包,根據不同操作不同解析
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: 10data,addr = udp_sock.recvfrom(1024)#接收服務端的資料 11data_len = len(data) 12send_data = struct.unpack("!HH",data[:4])#把二進位制轉換成資料 13if send_data[0] == 3:#3表示服務端傳送過來的資料包 14if send_data[1] == 1: 15f = open("b.png","wb+") 16f.write(data[4:])#資料包前4個位元組是操作碼和塊編號,之後的就是實際資料 17ack_data = struct.pack("!HH",4,send_data[1])#這裡的4確認碼send_data[1]是服務端發過來的塊編號 18udp_sock.sendto(ack_data,addr)#向服務傳送資料表示確認收到資料 19if data_len<516: 20f.close() 21print("下載完成") 22break 23elif send_data[0] == 5: 24print("下載失敗") 25break 26 udp_sock.close()