zoukankan      html  css  js  c++  java
  • python简单实现tftp客户端(基于udp)

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

    接下来了解下TFTP协议内容,

                   

    1:客户发送和服务端每次通信,都要携带2个字节操作码(包的类型),

    2:模式有三种类型,除了文件名其他基本上固定  

        (1)netascii,这是8位的ASCII码形式

        (2)octet,8位源数据类型

        (3)mail这种不在支

    3:TFTP支持五种类型的包,根据不同操作不同解析                                

           

    4:服务端把数据包发送到客户端,包括这次发送块数据的编号和数据一起发送到:客户端

    5:客户端接收到数据,要向服务服务

    看代码

     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()
  • 相关阅读:
    ChromeDriver下载
    LR基础理论详解
    python中assert详解
    python定义类()中写object和不写的区别
    python list初始化技巧
    python list中append()方法和extend()方法区别
    python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别
    使用__slots__节省python内存技巧
    lambda表达式详解
    python处理数据问题详解
  • 原文地址:https://www.cnblogs.com/zz-952/p/10388686.html
Copyright © 2011-2022 走看看