2014-12-31 1 views
0

Я пытаюсь присоединиться к многоадресной группе KNX (ip: 224.0.23.12; порт: 3671), но получаю OtherIoError.Результаты UDP `join_multicast` в OtherIOError

Соединение сокета появляется ОК, так как я могу отправить в группу многоадресной передачи (проверено Wireshark). Разумеется, я тестировал только один сетевой интерфейс и пытался заменить local_addr на 127.0.0.1, а также локальный IP-адрес. Моя версия Rust - 0.13.0-nightly (5ba610265 2014-12-25 18:01:36 +0000) работает под управлением Windows 7 (64 бит).

Аналогичный код работает в Go также с другим программным обеспечением, объединяющим эту группу многоадресной передачи.

use std::io::net::udp::UdpSocket; 
use std::io::net::ip::{Ipv4Addr, SocketAddr}; 

fn main() { 
    let local_addr = SocketAddr { ip: Ipv4Addr(0, 0, 0, 0), port: 3671 }; 
    let mut socket = match UdpSocket::bind(local_addr) { 
     Ok(s) => s, 
     Err(e) => panic!("couldn't bind socket: {}", e), 
    }; 
    match socket.join_multicast(Ipv4Addr(224, 0, 23, 12)) { 
     Err(why) => println!("! {}", why.kind), 
     Ok(_) => {}, 
    }; 
    drop(socket) 
} 
+0

Я запустил этот код на OS X, и никаких ошибок не было. Возможно, это будет проблема, связанная с платформой? В стороне, вам не нужно 'drop (socket)' - сокет будет закрыт, как только переменная выходит за пределы области видимости. – Shepmaster

+0

Если я изменяю 'why.kind' на' why', я получаю эту ошибку: 'OS Error 10042: неизвестный, недействительный или неподдерживаемый параметр или уровень был указан в вызове getsockopt или setsockopt.' – Shepmaster

+0

Для всех, кто сталкивается этот вопрос в будущем, 'join_multicast' был [устарел] (https://doc.rust-lang.org/1.3.0/std/net/struct.UdpSocket.html#method.join_multicast), а затем удален из' std', а функциональность переместилась в ['join_multicast_v4'] (https://doc.rust-lang.org/net2-rs/net2/trait.UdpSocketExt.html#tymethod.join_multicast_v4) и [' join_multicast_v6'] (https : //doc.rust-lang.org/net2-rs/net2/trait.UdpSocketExt.html#tymethod.join_multicast_v6) в ящике ['net2'] (https://crates.io/crates/net2). –

ответ

1

Хорошо, я думаю, что это ошибка в Rust.

Microsoft KB Это говорит:

Note that this includes Winsock.h. If the project is linked with Ws2_32.lib, setsockopt will fail with runtime error 10042 (WSAENOPROTOOPT). This is because in Winsock.h, IP_ADD_MEMBERSHIP is defined as "5". The corresponding Winsock runtime can not resolve option 5 at the IPPROTO_IP level, so the failure occurs with error code 10042.

Ржавчина константы are defined как 5 и 6, так что, возможно, кто-то схватил неправильные константы откуда-то? Я, вероятно, напишу официальную ошибку Rust для этого.

+0

[Я подал ошибку Rust] (https://github.com/rust-lang/rust/issues/20381). – Shepmaster

+0

Большое спасибо за вашу помощь в выяснении этой проблемы! –

+0

И [исправлено сейчас] (https://github.com/rust-lang/rust/pull/21267) – Shepmaster

 Смежные вопросы

  • Нет связанных вопросов^_^