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))
正是江南好风景