Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何“连接”UDP套接字并让操作系统选择端口和地址_Rust_Udp_Client - Fatal编程技术网

Rust 如何“连接”UDP套接字并让操作系统选择端口和地址

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

我想向服务器发送UDP查询并接收其响应。在C中是:。操作系统负责选择合适的本地IP地址和端口来使用

我也试着在铁锈上做同样的事。但是,如果不指定地址和端口,我就无法找到获取a的方法。我能做的最接近的事情是:

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版本相比有两个缺点

  • 如果我指定一个已在使用的本地端口,它可能会失败

  • 套接字侦听所有可用地址,而C版本只侦听“合适”地址。这对于UDP非常重要,以避免响应欺骗

    例如,如果我查询127.0.0.1,那么C版本将自动绑定到127.0.0.1地址。互联网将无法伪造我的问题的答案。另外,如果我有两个网络接口,一个连接到internet,另一个连接到IP 192.168.0.1的本地网络,我可以在本地网络上查询解析器,如172.16.17.18所示。C版本将绑定到地址192.168.0.1,我将确保答案不是来自互联网

  • 我怎样才能最好地实现与C版本相同的功能


    编辑:解释关于查找“合适”地址的第二点。

    这并不明显,但如果您将套接字绑定到
    (未指定,0)
    ,则当您连接到远程地址时,本地地址将设置为适当的接口地址。(Port
    0
    表示自动分配端口,就像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()
    进行了测试,它被正确设置为接口的地址。