2011-12-30 155 views
8

我試過了example,但它不起作用。顯然它沒有設置IPPROTO_IP/IP_MULTICAST_IF選項。我只能找到boost :: asio :: ip :: multicast :: outbound_interface IPPROTO_IP/IP_MULTICAST_IF,我試過但失敗了。有沒有什麼辦法可以讓boost :: asio :: ip :: multicast工作,而不需要調用c-level setsockopt?boost :: asio :: ip :: multicast :: join_group不起作用

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

使用'multicast :: join_group(multicast_address,listen_endpoint.address()。to_v4())'。 – 2011-12-30 14:04:41

+1

感謝您的提醒。剛剛嘗試過,我們必須將「0.0.0.0」設置爲listen_endpoint。所以工作版本是 boost :: asio :: ip :: udp :: endpoint listen_endpoint(udp :: v4(),multicast_port); ... socket_.set_option(multicast :: join_group(address :: from_string(group _)。to_v4(), address :: from_string(interface).to_v4())); – poordeveloper 2011-12-30 16:21:04

+0

@Stefan發表您的評論作爲答案 – 2011-12-30 18:28:28

回答

4

正確答案:

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

界面是什麼? – user997112 2014-06-12 12:16:52

+0

接口實際上是您的本地地址來過濾傳入的數據包。 – iyasar 2017-10-10 12:07:25

5

我認爲boost example code for udp multicast有錯誤。

在示例代碼中,它們將套接字綁定到本地接口,但對於udp多播,您必須綁定到udp多播組IP和端口。

socket_.bind(listen_endpoint); 

應該是:

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

看到multicast howto

...一個過程接受它有權要求內核 加入該組並綁定多播數據報端口那些數據報被髮送到 到。 UDP層使用目的地址和端口號來解複用數據包並決定將哪些數據包傳送給...

...有必要告訴內核我們對 感興趣的組播組也就是說,我們要問的內核「加入」那些 組播組...如果

檢查你加入羣組正確的接口與netstat -g | grep <multicast_group_ip>

這是我認爲不正確升壓示例代碼:

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));