2017-03-06 62 views
0

我還是個學生,所以我可能錯過了一些非常明顯的東西。是我的微不足道的tftp客戶端有缺陷的邏輯嗎?

所以我非常強調這一點。

但無論如何,這裏是我的TFTP python代碼,它只是從我們講師的服務器上下載一個文本文件。

由它生成的文件是這樣的: http://pastebin.com/TP8hngxM

和原來的文件是這樣的: http://pastebin.com/xDMjkABp

如果你通過差異檢查運行它,差別微乎其微,並僅在1特定的地方,我很難弄清楚爲什麼會發生這種情況。

下載的文件有一些額外的單詞。

如果您有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() 
+0

我想弄清楚這一點,我覺得我應該打破「如果代碼是5:」觸發。你們覺得怎麼樣? –

+0

我想我不能重現這一點。什麼是「glamnetsim」? – nickie

+0

這是一個模擬大學內部網絡的功能。無論如何,您將無法運行我的代碼,因爲它位於防火牆後面,因此您需要在校園內進行連接。我只是想弄清楚程序本身的邏輯是否有問題。 –

回答

0

f.write(文本)

即線與陳舊值,如果blockno == lastblock+1運行。它可能應該在內部循環內。

相關問題