2011-12-30 4 views
8

example을 시도했지만 작동하지 않습니다. 분명히 IPPROTO_IP/IP_MULTICAST_IF 옵션을 설정하지 않습니다. IPPROTO_IP/IP_MULTICAST_IF에 대한 boost :: asio :: ip :: multicast :: outbound_interface 만 찾을 수 있지만 시도했지만 실패했습니다. boost :: asio :: ip :: multicast를 C 레벨 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())'를 사용합니다. –

+1

알림을 보내 주셔서 감사합니다. 방금 시도 했으므로 "0.0.0.0"을 listen_endpoint로 설정해야합니다. 작동 버전은 입니다. boost :: asio :: ip :: udp :: endpoint listen_endpoint (udp :: v4(), multicast_port); ... socket_.set_option (멀티 캐스트 :: join_group (주소 :: from_string (그룹 _) .to_v4(), 주소 :: from_string (인터페이스) .to_v4()))); – poordeveloper

+0

@Stefan 대답으로 답변을 게시하십시오. –

답변

4

정답 : 나는 오류가 boost example code for udp multicast에 있다고 생각

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

+0

인터페이스는 실제로 들어오는 패킷을 필터링하는 로컬 주소입니다. – iyasar

5

.

예제 코드에서는 소켓을 로컬 인터페이스에 바인딩하지만 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)); 
관련 문제