2014-11-04 108 views
1

我在使用Rust实验BitTorrent跟踪器协议时遇到了此问题。UdpSocket.send_to失败,出现“无效参数”

这是应该发送使用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<IpAddr> = 
     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)) 

这是怎么回事不对任何想法?

+1

这看起来类似于http://stackoverflow.com/questions/7505315/invalid-argument-when-sending-udp-packet-but-它,它有帮助吗? – 2014-11-04 12:23:08

回答

3

您将套接字绑定到localhost(回送接口),然后尝试通过该套接字与不在该接口上的地址进行通信。如果你反而绑定到0.0.0.0,它会成功。这意味着“所有ipv4接口”。如有必要,您可以绑定到更具体的地址。

相关问题