我的客户在TFT背后的逻辑有缺陷吗?

2024-09-30 09:26:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我还是个学生,所以我可能错过了一些非常明显的东西。你知道吗

所以我很紧张。你知道吗

但不管怎样,这里是我的tftppython代码,它所做的只是从我们讲师的服务器下载一个文本文件。你知道吗

它生成的文件如下所示: http://pastebin.com/TP8hngxM

原始文件如下: http://pastebin.com/xDMjkABp

如果你通过一个差异检查器,差异是很小的,只有一个特定的点,我真的很难弄清楚为什么会发生这种情况。你知道吗

下载的文件有几个额外的单词。你知道吗

如果您有5分钟的空闲时间,请您查看一下我的嵌套while循环(其他内容都是讲师提供的,不能更改),看看有没有什么问题?你知道吗

最糟糕的是,我已经让它工作,但我失去了我的记忆棒,我失去了最新版本的程序,运行100%良好。你知道吗

所以正如我所说的,它只是关于嵌套while循环,我不允许更改它上面的任何内容。你知道吗

    #!/usr/bin/python

import struct
import sys
import os
import select
import glamnetsim
from socket import *

serverHost  = 'mcgreg.comp.glam.ac.uk'
serverPort  = 69
timeoutSecs =  5
debugging   = False
RRQ, WRQ, DATA, ACK, ERROR = range(1, 6)
codeDescriptions = {RRQ:"RRQ", WRQ:"WRQ", DATA:"DATA", ACK:"ACK", ERROR:"ERROR"}

def printf (format, *args):
    print str(format) % args,

def finish ():

    printf("you should see\n1e951df315d433aa4df2065a1ad31311\n")
    os.system("md5sum newfile.txt")
    sys.exit(0)

def sendPacket (packet, port):
    global sock, debugging
    global serverIp
    if debugging:
        for i in packet:
            print ('%02x' % ord(i)),
        print ''
    sock.sendto(packet, (serverIp, port))

def sendReadRequest (filename, mode):
    global serverPort
    format = "!H%ds" % (len(filename)+1)
    format += "%ds" % (len(mode)+1)
    s = struct.pack(format, 1, filename, mode)
    sendPacket(s, serverPort)

def sendRealAck(blockno, port):
    s = struct.pack("!H", 4)
    s += struct.pack("!H", blockno)
    sendPacket(s, port)

def sendACK (blockno, port):
    print " -> ACK:%d\n" % blockno
    if blockno == 0:
        sendReadRequest("the_machine_stops.txt", "octet")
    else:
        sendRealAck(blockno, port)

def stripPacket (s):
    if len(s)>3:
        code = struct.unpack("!H", s[:2])[0]
        blockno = struct.unpack("!H", s[2:4])[0]
        data = s[4:]
        code, data = glamnetsim.simulatePossibleError (code, data)
        return code,blockno,data
    else:
        debugPrint("corrupt packet")
        return -1,-1,""

        def debugPrint (s):
    global debugging
    if debugging:
        print s

def getDesc (c):
    global codeDescriptions
    return codeDescriptions[c]

sock = socket(AF_INET, SOCK_DGRAM)
serverIp = gethostbyname(serverHost)
sock.setblocking(1)
sendReadRequest("the_machine_stops.txt", "netascii")
lastblock = 0
blockno = 0
port = serverPort
f = open("newfile.txt", "w")

while True:
    while True:

        if blockno == lastblock+1:
                break

        r, w, x = select.select([sock], [], [], 5.0)

        if r == []:
            sendACK(lastblock, port)

        else:

            (packet, (address, port)) = sock.recvfrom(512+4)
            code, newblock, text = stripPacket(packet)
            print code, blockno         

            if code is 3:
                blockno = newblock
                sendACK(blockno, port)

            if code is 5:
                sendACK(lastblock, port)

            print "Bn: " + str(blockno) + " Lb: " + str(lastblock)
    lastblock = blockno
    f.write(text)
    print "OK"
    if len(text) < 512:
        break
f.close()
finish()

Tags: importformatifpacketportdefcodeglobal

热门问题