• TFTP 服务器


    TFTP(Trivial File Transfer Protocol,简单文件传输协议)

    是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议

    特点:

    • 简单
    • 占用资源小
    • 适合传递小文件
    • 适合在局域网进行传递
    • 端口号为69
    • 基于UDP实现

     

    为了标记数据已经发送完毕,所以规定,当客户端接收到的数据小于516(2字节操作码+2个字节的序号+512字节数据)时,就意味着服务器发送完毕了

    from socket import *
    import struct
    import sys
    
    if len(sys.argv) != 2:
        print('-'*30)
        print("tips:")
        print("python xxxx.py 192.168.1.1")
        print('-'*30)
        exit()
    else:
        ip = sys.argv[1]
    
    # 创建udp套接字
    udpSocket = socket(AF_INET, SOCK_DGRAM)
    
    #构造下载请求数据
    cmd_buf = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)
    
    #发送下载文件请求数据到指定服务器
    sendAddr = (ip, 69)
    udpSocket.sendto(cmd_buf, sendAddr)
    
    p_num = 0
    
    recvFile = ''
    
    while True:
        recvData,recvAddr = udpSocket.recvfrom(1024)
    
        recvDataLen = len(recvData)
    
        # print recvAddr # for test
    
        # print len(recvData) # for test
    
        cmdTuple = struct.unpack("!HH", recvData[:4])
    
        # print cmdTuple # for test
    
        cmd = cmdTuple[0]
        currentPackNum = cmdTuple[1]        
    
        if cmd == 3: #是否为数据包
    
            # 如果是第一次接收到数据,那么就创建文件
            if currentPackNum == 1:
                recvFile = open("test.jpg", "a")
    
            # 包编号是否和上次相等
            if p_num+1 == currentPackNum:
                recvFile.write(recvData[4:]);
                p_num +=1
                print '(%d)次接收到的数据'%(p_num)
    
                ackBuf = struct.pack("!HH",4,p_num)
    
                udpSocket.sendto(ackBuf, recvAddr)
            # 如果收到的数据小于516则认为出错
            if recvDataLen<516:
                recvFile.close()
                print '已经成功下载!!!'
                break
    
        elif cmd == 5: #是否为错误应答
            print "error num:%d"%currentPackNum
            break
    
    udpSocket.close()
  • 相关阅读:
    寻找项目中顶级Vue对象 (一)
    vue文件中style标签的几个标识符
    vue中methods中的方法闭包缓存问题
    斐波那契数列实现
    ECMAScript 6 入门学习笔记(零)——开始
    Extjs6(三)——用extjs6.0写一个简单页面
    同域和不同域长啥样
    Extjs6组件——Form大家族成员介绍
    Extjs6官方文档译文——应用架构简介(MVC,MVVM)
    Extjs6(特别篇)——项目自带例子main.js拆分详解
  • 原文地址:https://www.cnblogs.com/ghming/p/8810235.html
Copyright © 2020-2023  润新知