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

时间:2019-07-11 03:15:55

标签: rust udp

我正在使用simple example来创建rust udp客户端/服务器应用程序。但是,当尝试使用send_to或recv_from方法时,出现以下错误:

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

我还没有以任何方式更改cargo.toml文件,但是我没想到会那样,因为我正在使用锈版本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),
    }
}


在使用货机时,在服务器端也会出现以下错误。

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

编辑: 看来这是忘记从UdpSocket :: bind返回时处理错误处理的结果。帖子中将对此进行更详细的讨论 How to do error handling in Rust and what are the common pitfalls?,如下所述。

这个问题大部分都保持不变,因为我还没有看到很多明确涉及net :: UdpSocket的问题或示例

1 个答案:

答案 0 :(得分:1)

let socket = UdpSocket::bind(connection);

此调用返回Result,它可以表示成功值或错误值。 unwrap()强制其产生成功值(Ok的内容)。如果出现错误(值是Err),它也会惊慌。

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

或者您也可以使用Expect来在恐慌之前打印邮件。

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