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()
我想弄清楚這一點,我覺得我應該打破「如果代碼是5:」觸發。你們覺得怎麼樣? –
我想我不能重現這一點。什麼是「glamnetsim」? – nickie
這是一個模擬大學內部網絡的功能。無論如何,您將無法運行我的代碼,因爲它位於防火牆後面,因此您需要在校園內進行連接。我只是想弄清楚程序本身的邏輯是否有問題。 –