我正在尝试向对等端发送BitTorrent握手,但这不起作用。有人能找出我做错了什么吗?len应该会带着什么回来,但现在是零。

require 'bencode'
require 'digest/sha1'

file = File.open('./python.torrent').read
info_hash = Digest::SHA1.hexdigest(a['info'].bencode)

# Here's what parsed_response['peers'] returns:
# [{"ip"=>"8.19.35.234", "peer id"=>"-lt0C20-\x90\xE0\xE6\x0E\xD0\x8A\xE5\xA2\xF2b(!",
# "port"=>9898}]
peer_id = parsed_response['peers'].first['peer id']

send_string = "\023BitTorrent protocol\0\0\0\0\0\0\0\0" << info_hash << peer_id

# ip and port are my current internet ip and 6881 respectively
client = TCPSocket.new ip, port

# What I'm sending over
client.send("\023BitTorrent protocol\0\0\0\0\0\0\0\0" << info_hash << peer_id, 0)
len = client.recv(1)
puts len

下面是send_string最后的样子:

最佳答案

一边和你握手,
皮里德应该是你的,而不是对方的。
所以你的信息应该是这样的:

peer_id = "-MY0001-123456654321"
client.send("\023BitTorrent protocol\0\0\0\0\0\0\0\0" << info_hash << peer_id, 0)

如果您正在开发自己的Bit Torrent客户机,那么可以按照Bit Torrent协议中提到的标准,为对等ID设置自己的格式。
您可以在此处阅读有关对等ID的更多信息:
https://wiki.theory.org/BitTorrentSpecification#peer_id
如果您将来有任何困惑,请启动任何BitTorrent客户端并遵循wire-shark数据包。你会明白,你在哪里犯错。
我在这里附上一个握手信息示例:
ruby - BitTorrent同伴握手-LMLPHP
这里“-ks0001-123456654321”是我的BitTorrent客户机的peerID。

关于ruby - BitTorrent同伴握手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18394049/

10-10 21:14