我正在使用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的问题或示例
答案 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");