查询DHT服务器

问题描述 投票:0回答:2

我正在尝试对 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 实现这个。 这可能吗?我的代码有什么问题吗?

php udp dht
2个回答
1
投票

正如 the8472 提到的,您的客户端正在发送

p
,这不是有效的查询。要查看有效的查询格式,请查看此处:bep 005


0
投票

首先,您需要指定您是否尝试执行 find_node 或 get_peers。假设它的 find_node 您的请求应如下所示:

{"t":"aa", "y":"q", "q":"find_node", "a": {"id":"abcdefghij0123456789", "target":"mnopqrstuvwxyz123456"}}

  • t = TID 或数据包的随机 ID
  • y = 查询
  • a = 请求对象
  • target = 是您请求的节点列表
  • id = 您的节点 ID - 这是您的 IP 的 CRC32C 哈希 + 随机数。

制作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 解析。 由于某种原因,主要引导节点都没有回复。
© www.soinside.com 2019 - 2024. All rights reserved.