#encoding=utf-8
#测试tftp文件下载
#struct帮助组织数据
import struct
from socket import *
filename="pingjia.jpg"
#服务器所在ip地址,这是本机地址
server_ip="192.168.1.116"
send_data=struct.pack("!H%dsb5sb"%len(filename),1,filename.encode(),0,"octet".encode(),0)
s=socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data,(server_ip,69))
f=open(filename,"ab")
#回归数据包
while True:
    recv_data=s.recvfrom(1024)  #接收数据
    caozuoma,ack_num=struct.unpack("!HH",recv_data[0][:4])  #获取数据块编码
    rand_port=recv_data[1][1]   #获得数据块的随机端口
    #操作码是5,就代表是个错误包
    if int(caozuoma)==5:
        print("文件不存在...")
        break
    #记得这种操作
    print("操作码:%d,ACK:%d,服务器随机端口:%d,数据长度:%d"%(caozuoma,ack_num,rand_port,len(recv_data))
    #从第四个开始写(不同于[:4]),后面第512个字节是要写入的(前面四个已经被占了)
    f.write(recv_data[0][4:])
    #将数据写入f(就是从服务器下载出来的文件)
    if len(recv_data[0])<516:
        break
    ack_data=struct.pack("!HH",4,ack_num)
    s.sendto(ack_data,(server_ip,rand_port))    #回复ACK确认包可以输出文件不存在,但是
f.write(recv_data[0][4:])
这个出错了,搞不明白