Rust std::net::UdpSocket 没有名为 recv_from 的方法

Rust std::net::UdpSocket no method named recv_from

我正在研究 simple example 以创建 rust udp client/server 应用程序。但是当尝试使用 send_to 或 recv_from 方法时,我收到以下错误:

[E0599] 在当前范围内找不到类型 std::result::Result<std::net::UdpSocket, std::io::Error> 的名为 send_to 的方法。

我没有以任何方式更改 cargo.toml 文件,但是我没想到我必须这样做,因为我使用的是 rust 版本 1.35.0 的标准库。

客户端和服务器都是使用 cargo new [filename] --bin 创建的,代码在 main.rs

客户

use std::net::{Ipv4Addr, SocketAddrV4, UdpSocket};
use std::io;

fn snd()  -> Result<(), io::Error> {
    // Define the local connection (to send the data from)
    let ip = Ipv4Addr::new(127, 0, 0, 1);
    let connection = SocketAddrV4::new(ip, 9992);

    // Bind the socket
    // let socket = try!(UdpSocket::bind(connection));
    let socket = UdpSocket::bind(connection);

    // Define the remote connection (to send the data to)
    let connection2 = SocketAddrV4::new(ip, 9991);

    // Send data via the socket
    let buf = &[0x01, 0x02, 0x03];
    socket.send_to(buf, &connection2);
    println!("{:?}", buf);

    Ok(())
}

fn main() {
    match snd() {
        Ok(()) => println!("All snd-ing went well"),
        Err(err) => println!("Error: {:?}", err),
    }
}

服务器

use std::net::{Ipv4Addr, SocketAddrV4, UdpSocket};
use std::io;

fn recv()  -> Result<(), io::Error> {
    // Define the local connection information
    let ip = Ipv4Addr::new(127, 0, 0, 1);
    let connection = SocketAddrV4::new(ip, 9991);

    // Bind the socket
    // let socket = try!(UdpSocket::bind(connection));
    let socket = UdpSocket::bind(connection);

    // Read from the socket
    let mut buf = [0; 10];
    // let (amt, src) = try!(socket.recv_from(&mut buf));
    let (amt, src) = socket.recv_from(&mut buf).expect("Didn't recieve data");

    // Print only the valid data (slice)
    println!("{:?}", &buf[0 .. amt]);

    Ok(())
}

fn main() {
    match recv() {
        Ok(()) => println!("All recv-ing went well"),
        Err(err) => println!("Error: {:?}", err),
    }
}


我在使用 cargo build 时在服务器端也出现以下错误。

[E0599] 在当前范围内找不到类型 std::result::Result<std::net::UdpSocket, std::io::Error> 的名为 recv_from 的方法。

编辑: 这似乎是忘记在 UdpSocket::bind 中处理 return 中的错误处理的结果。 post 中对此进行了更详细的讨论 如下所述。

这个问题基本上完好无损,因为我没有看到很多明确处理 net::UdpSocket

的问题或例子
let socket = UdpSocket::bind(connection);

这个调用returns Result可以代表成功值或错误值。 unwrap() 强制它产生成功值(Ok 的内容)。如果出现错误,它也会出现恐慌(值为 Err)。

let socket = UdpSocket::bind(connection).unwrap();

或者您也可以使用 expect,它会在恐慌之前打印消息。

let socket = UdpSocket::bind(connection).expect("failed to bind host socket");