Rust stdのnetを触ってみる

Rust stdのnetを触ってみる

Rustで通信したい!そう思ったことはありませんか?

私は割と常に思っています。そして最終的にはブログもRustで書かれたWebサーバーで動かしたいと思っています。ってか存在はしてると思うけど……自分の力で作り出したいわけです

そこでstdのnetを理解しないといけないということです

三日くらい触ってなんとなくわかってきたので備忘録として書き残そうと思います。

Webサーバーを作る

第一にRustには素晴らしいBookというものが存在しています。

これの最後の項にWebサーバーを作るという項があるのでまずはこれを参考にしていきます

fn test1() {
    let listener = TcpListener::bind("127.0.0.1:7878").unwrap();

    for stream in listener.incoming() {
        let stream = stream.unwrap();

        handle_connection(stream);

    }
}

fn handle_connection(mut stream: TcpStream) {
    let mut buffer = [0; 1024];
    stream.read(&mut buffer).unwrap();

    let get = b"GET / HTTP/1.1\r\n";
    
    println!("Request: {}", String::from_utf8_lossy(&buffer[..]));

    if buffer.starts_with(get) {
        let mut file = File::open("home.html").unwrap();

        let mut contents = String::new();
        file.read_to_string(&mut contents).unwrap();

        let response = format!("HTTP/1.1 200 OK\r\n\r\n{}", contents);

        stream.write(response.as_bytes()).unwrap();
        stream.flush().unwrap();
    }else {
        let status_line = "HTTP/1.1 404 NOT FOUND\r\n\r\n";
        let mut file = File::open("404.html").unwrap();
        let mut contents = String::new();
    
        file.read_to_string(&mut contents).unwrap();
    
        let response = format!("{}{}", status_line, contents);
    
        stream.write(response.as_bytes()).unwrap();
        stream.flush().unwrap();
    }
}

そして出来上がったのが上のコード。

localhostの7878ポートに見張りを作り、そのポートにリクエストが来るのを監視するだけ

GET / HTTP/1.1\r\n から始まるリクエストが来た場合のみあらかじめ作成しておいたhome.htmlを返し、それ以外では404.htmlを返すだけの簡単なものになっています。

これでローカルホストでのめちゃくちゃ単純なWebサーバーが完成したわけですが……私が本当にやりたかったことはこれだったのかと聞かれると違うと答えます

私は本当は応答する側じゃなくて、リクエストを送る側になりたかった!ということで別の機構を作ります

Httpリクエストを送ってみる

手始めにwww.google.co.jpにリクエストを送ってみました

fn test2() {
    let addr_iter = "www.google.co.jp:443".to_socket_addrs().unwrap();
    for addr in addr_iter {
        if addr.is_ipv4(){
            println!("{addr}");
            let stream = TcpStream::connect(addr).unwrap();
            let mut buf_reader = BufReader::new(&stream);
            let mut buf_writer = BufWriter::new(&stream);
            buf_writer.write(b"GET / HTTP/1.1\r\n").unwrap();
            buf_writer.flush().unwrap();
            let mut buf = [0; 1024];
            buf_reader.read(&mut buf).unwrap();
            println!("Request: {}", String::from_utf8_lossy(&buf[..]));
        };
    }
}

結論から言うとおそらく失敗しました。というのも実行してもなんの反応もないわけです。

プログラムがunwrapでpanicを起こすでもなく、HttpリクエストでBadreqwestが返ってくるわけでもなく……ただただ虚無が返ってきたのでよくわかりません。

ここで使っているのはTcpなので、暗号化されていない。つまり、httpsの通信ではないのが原因ではないかと考えていますが、普通にポートが間違ってたり等の様々な原因が考えられるため投げだしたい気分であります。

改善しようとhttps通信をとりあえず実装しようというところで今回の備忘録は終了!

要約すると 何の成果も得られませんでした ってことで

ssl難しくて何も分からない……誰か教えて……?

あ、crate使えっていうのは無しで……もしかして使わないとできない……?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です