我在使用Rust尝试使用BitTorrent跟踪器协议时遇到了这个问题.
这个应该使用UDP套接字发送一些数据的简单程序失败了:
use std::collections::HashSet; use std::io::net::addrinfo; use std::io::net::ip::{Ipv4Addr, SocketAddr, IpAddr}; use std::io::net::udp::UdpSocket; fn main() { let addr = SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 34254 }; let mut socket = match UdpSocket::bind(addr) { Ok(s) => s, Err(e) => panic!("couldn't bind socket: {}", e), }; let host_addr = "tracker.openbittorrent.com"; let port = "80"; let host_ips: HashSet= addrinfo::get_host_addresses(host_addr.as_slice()).unwrap().into_iter().collect(); for host_ip in host_ips.into_iter() { let socket_addr = SocketAddr { ip: host_ip, port: from_str(port).unwrap(), }; println!("Sending to {}", socket_addr); let data: &[u8] = [0x1, 0x2, 0x3]; println!("{}", socket.send_to(data, socket_addr)); } }
输出:
Sending to 31.172.63.252:80 Err(invalid argument (Invalid argument)) Sending to 31.172.63.253:80 Err(invalid argument (Invalid argument))
关于出了什么问题的任何想法?
您正在将套接字绑定到localhost(环回接口),然后尝试通过该套接字与不在该接口上的地址进行通信.如果您改为绑定0.0.0.0
,它将成功.这意味着"所有ipv4接口".如有必要,您可以绑定到更具体的地址.