bind()下面的调用适用于 IPV4,但不适用于 IPV6。
pub enum SocketAddr {
V4(SocketAddrV4),
V6(SocketAddrV6),
}
pub fn new<A: ToSocketAddrs>(local_addr: A, _: Option<u32>) -> io::Result<UdpConnector> {
let mut addr = net::addr_from_trait(local_addr)?;
debug!("Attempting to connect to {:?}", addr);
UdpSocket::bind(addr).expect(&format!("Couldn't bind to address {:?}", addr))
}
Run Code Online (Sandbox Code Playgroud)
我认为我需要scope_id为SocketAddrV6. 但是,我没有SocketAddrV6,我只有一个SocketAddr没有实现scope_id().
我可以调用is_ipv6()它SocketAddr,以查看它是什么类型。如果是IPV6,那么用C语言来说,我想投射到底层SocketAddrV6,所以我可以调用set_scope_id()它。然后我想将结果SocketAddr或SocketAddrV6变量传递给bind().
以下显然仅适用于原始类型:
let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)
如果我尝试进行隐式转换,则会出现类型不匹配错误。我想它告诉我这addr是一个枚举,而不是一个SocketAddrV6结构。我知道。我如何在 Rust 中进行强制转换?
pub enum SocketAddr {
V4(SocketAddrV4),
V6(SocketAddrV6),
}
pub fn new<A: ToSocketAddrs>(local_addr: A, _: Option<u32>) -> io::Result<UdpConnector> {
let mut addr = net::addr_from_trait(local_addr)?;
debug!("Attempting to connect to {:?}", addr);
UdpSocket::bind(addr).expect(&format!("Couldn't bind to address {:?}", addr))
}
Run Code Online (Sandbox Code Playgroud)
这是另一个转换尝试。同样的错误。
let addr2 = addr as SocketAddrV6
Run Code Online (Sandbox Code Playgroud)
另一个尝试
54 | let addr2: SocketAddrV6 = addr;
| ------------ ^^^^ expected struct `std::net::SocketAddrV6`, found enum `std::net::SocketAddr`
Run Code Online (Sandbox Code Playgroud)
编辑:基于@Lukas 解决方案,以下似乎可以编译,但我还不知道它是否在做我想要的。
55 | let addr2 = SocketAddr::V6(addr);
| ^^^^ expected struct `std::net::SocketAddrV6`, found enum `std::net::SocketAddr`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |