2011-12-30 23 views
8

Tôi đã thử các example, nhưng nó không hoạt động. Dường như nó không đặt tùy chọn IPPROTO_IP/IP_MULTICAST_IF. Tôi chỉ có thể tìm thấy tăng :: asio :: ip :: multicast :: outbound_interface cho IPPROTO_IP/IP_MULTICAST_IF, tôi đã thử nhưng không thành công. Có cách nào để làm cho tăng :: asio :: ip :: multicast làm việc mà không gọi c-level setsockopt?boost :: asio :: ip :: multicast :: join_group không hoạt động

boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port); 
socket_.open(listen_endpoint.protocol()); 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(listen_endpoint); 

// Join the multicast group. 
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address)); 
+2

sử dụng 'multicast :: join_group (multicast_address, listen_endpoint.address(). To_v4())'. –

+1

Cảm ơn lời nhắc của bạn. Chỉ cần thử, và chúng ta phải đặt "0.0.0.0" thành listen_endpoint. Vì vậy, phiên bản làm việc là boost :: asio :: ip :: udp :: endpoint listen_endpoint (udp :: v4(), multicast_port); ... socket_.set_option (multicast :: join_group (địa chỉ :: from_string (nhóm _). To_v4(), address :: from_string (interface) .to_v4())); – poordeveloper

+0

@Stefan đăng nhận xét của bạn dưới dạng câu trả lời –

Trả lời

4

Đúng trả lời:

boost::asio::ip::udp::endpoint listen_endpoint(udp::v4(), multicast_port); 
... 
socket_.set_option(multicast::join_group(
    address::from_string(multicast_address).to_v4(), 
    address::from_string(interface).to_v4())); 
+5

Giao diện là gì? – user997112

+0

giao diện thực sự là địa chỉ cục bộ của bạn để lọc các gói dữ liệu đến. – iyasar

5

Tôi nghĩ rằng có một lỗi trong boost example code for udp multicast.

Trong mã ví dụ, chúng liên kết ổ cắm với giao diện cục bộ nhưng đối với đa hướng udp bạn phải liên kết với IP và cổng IP của nhóm phát đa hướng udp.

socket_.bind(listen_endpoint); 

nên là:

socket_.bind(
    boost::asio::ip::udp::endpoint(multicast_address, multicast_port)); 

thấy multicast howto:

... cho một quá trình để nhận datagram multicast nó có hỏi kernel tham gia vào nhóm và ràng buộc chuyển các gói dữ liệu đó đang được gửi đến. Lớp UDP sử dụng cả địa chỉ đích và cổng đến phân tách các gói và quyết định (các) socket nào sẽ phân phối chúng đến ...

... cần phải thông báo cho hạt nhân rằng nhóm đa hướng chúng tôi là quan tâm đến . Nghĩa là, chúng ta phải tự hỏi hạt nhân để "tham gia" những nhóm multicast ...

kiểm tra nếu bạn tham gia nhóm trên giao diện chính xác với netstat -g | grep <multicast_group_ip>

này là tôi tin rằng tăng không chính xác mã ví dụ :

boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port); 
socket_.open(listen_endpoint.protocol()); 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(listen_endpoint); 

// Join the multicast group. 
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address)); 

socket_.async_receive_from(
    boost::asio::buffer(data_, max_length), sender_endpoint_, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
Các vấn đề liên quan