2

編集者注: このコード例は、Rust 1.0 より前のバージョンのものであり、有効な Rust 1.0 コードではありません。質問で説明されている概念は引き続き有効です。

Rust を使用して torrent スクレイピングを試しています。Wireshark で着信パッケージを確認できますが、recv_from呼び出しは常に を返しError("End of file")ます。これが私のプログラムです:

use std::io::net::ip::{Ipv4Addr, SocketAddr};
use std::io::net::udp::UdpSocket;
use std::rand;

use std::io::MemWriter;

fn main() {
    let addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 35000 };
    let mut socket = match UdpSocket::bind(addr) {
        Ok(s) => s,
        Err(e) => panic!("couldn't bind socket: {}", e),
    };

    let mut buf: Vec<u8> = Vec::with_capacity(1000);

    let transaction_id: u32 = rand::random();
    let mut req_data = MemWriter::with_capacity(16);
    req_data.write_be_u64(0x41727101980).unwrap(); // connection_id, identifies the protocol.
    req_data.write_be_u32(0).unwrap(); // action: connect
    req_data.write_be_u32(transaction_id).unwrap();

    println!("{}", socket.send_to(req_data.get_ref(), ("31.172.63.252", 80)));

    match socket.recv_from(buf.as_mut_slice()) {
        Ok((amt, src)) => {
            println!("Got {} bytes from {}.", amt, src);
        },
        Err(err) => println!("Can't recv_from: {}", err)
    }
}

出力は常に次のとおりです。

➜  udp-bug git:(master) ✗ cargo run
   Compiling udp-bug v0.0.1 (file:///home/omer/rust/udp-bug)
     Running `target/udp-bug`
Ok(())
Can't recv_from: end of file

ただし、予想される応答が Wireshark に表示されることがわかります。

20235   3512.148636000  31.172.63.252   192.168.1.4 QUIC    60  CID: 0, Seq: 0

このパッケージには 16 バイトのペイロードがあり、まさに私の予想どおりです。何がうまくいかないのですか?

4

1 に答える 1