TFTP下载器客户端

 1 import struct
 2 from socket import *
 3 filename='face.jpg'
 4 server_ip='127.0.0.1'
 5 #封装读请求
 6 send_data=struct.pack('!H%dsb5sb'%len(filename),1,filename.encode(),0,'octet'.encode(),0)
 7 #创建udp_socket套接字
 8 udp_socket=socket(AF_INET,SOCK_DGRAM)
 9 udp_socket.sendto(send_data,(server_ip,69))#读写端口默认是69
10 #本地创建一个文件
11 f=open(filename,'ab') #a追加模式  b二进制
12 while True:
13     recv_data=udp_socket.recvfrom(1024)
14     # print(recv_data) ('19\x1a&\'()*56789:CDEFGHI', ('127.0.0.1', 63568))
15     #获取操作码及数据块编号
16     caozuoma,ack_num=struct.unpack('!HH',recv_data[0][:4])# 4个字节  前4个字节
17     #判断操作码是否是5如果是5,则是错误信息
18     if caozuoma == 5:
19         print('文件不存在') 
20         break
21     #将接收到的数据写入到文件中 
22     f.write(recv_data[0][4:]) #前4个是操作码和数块编号
23     if len(recv_data[0])<516: #表示读取完
24         break
25     #发送确认包
26     ack_data=struct.pack('!HH',4,ack_num)
27     rand_port=recv_data[1][1] #获取服务器发送数据的随机端口
28     udp_socket.sendto(ack_data,(server_ip,rand_port))

 

posted @ 2020-04-14 22:18  小他_W  阅读(325)  评论(0编辑  收藏  举报