我正在尝试对 DHT 服务器进行简单查询。
我正在尝试制作一个简单的示例来测试对服务器的查询,但我没有从服务器获得任何形式的响应...
小例子:
$socket = fsockopen("udp://router.bittorrent.com", 6881, $errno, $errstr, 3);
fwrite($socket, 'p'); $Head = fread($socket, 4);
$CheckStatus = socket_get_status($socket);
if($CheckStatus["unread_bytes"] == 0)
{
return 0;
}
$do = 1;
while($do)
{
$str = fread($socket,1);
$stats .= $str;
$status = socket_get_status($socket);
if($status["unread_bytes"] == 0)
{
$do = 0;
}
}
fclose($socket);
有关 DHT 服务器中查询的信息在这里:http://www.bittorrent.org/beps/bep_0005.html#dht-queries
但我不明白如何用 PHP 实现这个。 这可能吗?我的代码有什么问题吗?
首先,您需要指定您是否尝试执行 find_node 或 get_peers。假设它的 find_node 您的请求应如下所示:
{"t":"aa", "y":"q", "q":"find_node", "a": {"id":"abcdefghij0123456789", "target":"mnopqrstuvwxyz123456"}}
制作ID示例:
fn derive_uid(&mut self) {
let mut ip: Vec<u8> = match self.consensus_external_address {
IpAddr::V4(v4) => v4.octets().to_vec(),
IpAddr::V6(v6) => v6.octets().to_vec(),
};
let mask: Vec<u8> = if ip.len() == 4 {
V4_MASK.to_vec()
} else {
V6_MASK.to_vec()
};
for i in 0..mask.len() {
ip[i] &= mask[i];
}
//let mut rng = rand::thread_rng();
let rand: u8 = /*rng.gen::<u8>()*/utils::random::gen::<u8>() & 0xFF;
let r = rand & 0x7;
ip[0] |= r << 5;
let mut c = CRC32c::new();
c.update(&ip, 0, ip.len());
let crc = c.get_value();
let mut bid = [0u8; ID_LENGTH];
bid[0] = (crc >> 24) as u8;
bid[1] = (crc >> 16) as u8;
bid[2] = ((crc >> 8) as u8 & 0xF8) | (/*rng.gen::<u8>()*/utils::random::gen::<u8>() & 0x7);
for i in 3..19 {
bid[i] = /*rng.gen::<u8>()*/utils::random::gen::<u8>() & 0xFF;
}
bid[19] = rand & 0xFF;
self.uid = Some(UID::from(bid));
}
router.bittorrent.com
最近回复的频率不高,事实上已经两个月没有回复了。我建议尝试这个节点:
87.98.162.88
- 这是 dht.transmissionbt.com
的第二个 DNS 解析。
由于某种原因,主要引导节点都没有回复。