gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:28:43 28 4
gpt4 key购买 nike

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

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

我没有以任何方式更改 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] 没有名为 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 的问题或示例

最佳答案

let socket = UdpSocket::bind(connection);

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

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

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

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

关于Rust std::net::UdpSocket 没有名为 recv_from 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56981152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com