2016-02-02 100 views
0

我最近開始在Python 3中編寫我自己的BitTorrent客戶端。在我遇到以下問題之前,所有內容都是完美的: 當我向其中一個對等方發送格式化的握手消息時,我沒有收到任何響應握手(b'',當buff未解碼時)。下面是代碼:爲什麼對等方發送握手消息來響應我發送的握手消息?

handshakemsg = chr(19)+"BitTorrent protocol"+8*chr(0)+ 
     getinfohash()+"HAHA-0142421214125A-") 
s.send(handshakemsg.encode()) 
print("Connection to peer accepted") 
buff = s.recv(len(handshakemsg)) 
print(buff) 

這是發送握手消息我認爲正確的方法,但反應並不像說明書中所描述的一個。我想知道爲什麼會發生這種情況,我該如何避免這種情況?

+1

也許是因爲你拼寫爲 「協議」 錯了嗎? – Roddy

+0

不,這不是原因,我做了測試,如果我發送錯誤的握手會發生什麼,但我忘了在這裏改變它。感謝提醒我反正 –

+0

你能顯示二進制輸出嗎?捕捉它與wireshark – the8472

回答

0

http://bittorrent.org/beps/bep_0003.html#peer-protocol

固定報頭之後來到8個保留字節,這是在目前所有的實施方式中的所有零。如果您希望使用這些字節擴展協議,請與Bram Cohen協調以確保所有擴展都兼容。 接下來是20字節 sha1散列號來自元信息文件的信息值的代碼化形式。

你的是40(十六進制編碼)。 Bittorrent是一種二進制協議,而不是文本。

+0

非常感謝你:) –

-1

確保整個握手消息發送到遠程對等,所以嘗試使用socket.sendall()方法。

變化:

s.send(handshakemsg.encode()) 

到:

s.sendall(handshakemsg.encode()) 
+0

在目前的情況下,握手消息未被正確讀取的原因是因爲握手包含十六進制編碼的屬性而不是字節編碼的屬性,正如已批准的答案中所述。 –