Rust 如何“连接”UDP套接字并让操作系统选择端口和地址
我想向服务器发送UDP查询并接收其响应。在C中是:。操作系统负责选择合适的本地IP地址和端口来使用 我也试着在铁锈上做同样的事。但是,如果不指定地址和端口,我就无法找到获取a的方法。我能做的最接近的事情是:Rust 如何“连接”UDP套接字并让操作系统选择端口和地址,rust,udp,client,Rust,Udp,Client,我想向服务器发送UDP查询并接收其响应。在C中是:。操作系统负责选择合适的本地IP地址和端口来使用 我也试着在铁锈上做同样的事。但是,如果不指定地址和端口,我就无法找到获取a的方法。我能做的最接近的事情是: fn main() { use std::net::{Ipv4Addr, UdpSocket}; let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 12345)).unwrap(); socket.connect
fn main() {
use std::net::{Ipv4Addr, UdpSocket};
let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 12345)).unwrap();
socket.connect("1.1.1.1:53").unwrap();
socket.send(b"\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\
\x07example\x03com\x00\
\x00\x01\x00\x01").unwrap();
let mut buffer = [0; 512];
let len = socket.recv(&mut buffer).unwrap();
for b in &buffer[0..len] {
print!("{:02x} ", b);
}
println!("");
}
这是可行的,但与C版本相比有两个缺点
编辑:解释关于查找“合适”地址的第二点。这并不明显,但如果您将套接字绑定到
(未指定,0)
,则当您连接到远程地址时,本地地址将设置为适当的接口地址。(Port0
表示自动分配端口,就像C中的未绑定套接字一样。)连接成功后,您可以通过调用套接字上的local_addr()
来确认这一点
我为POSIX的复杂性道歉。:-) 你能澄清你问题的第二部分吗?第一个问题的答案是,您可以绑定端口
0
以获得随机分配的端口。@loganfsmyth绑定端口0解决端口部分。非常感谢。我编辑了这个问题来解释关于IP地址的部分。Rust API与C Posix API相同,您在这里描述的是UDP而不是Rust的问题。我不明白你想要什么,你的第2点完全是错的。@Stargateur不,Rust API要求我绑定。我不需要绑定C。请参阅我问题中的链接。您确定您没有获得正确的本地地址吗?绑定(未指定,0)
后,我使用socket.local\u addr()
进行了测试,它被正确设置为接口的地址。