2013-01-02 157 views
1

我試圖用redhat中的參數0.0.0.0 127.0.0.1運行以下程序,並且在socket_.set_option(boost :: asio :: ip: :組播:: join_group(multicast_address));Boost asio set_option error

它也試圖在窗口中運行它,它在vC++中工作正常。我沒有想法。請幫助我。

// 
// receiver.cpp 
// ~~~~~~~~~~~~ 
// 
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com) 
// 
// Distributed under the Boost Software License, Version 1.0. (See accompanying 
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
// 

#include <iostream> 
#include <string> 
#include <boost/asio.hpp> 
#include "boost/bind.hpp" 

const short multicast_port = 30001; 

class receiver 
{ 
public: 
    receiver(boost::asio::io_service& io_service, 
     const boost::asio::ip::address& listen_address, 
     const boost::asio::ip::address& multicast_address) 
    : socket_(io_service) 
    { 
    // Create the socket so that multiple may be bound to the same address. 
    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)); <-- Error** 

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

    void handle_receive_from(const boost::system::error_code& error, 
     size_t bytes_recvd) 
    { 
    if (!error) 
    { 
     std::cout.write(data_, bytes_recvd); 
     std::cout << std::endl; 

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

private: 
    boost::asio::ip::udp::socket socket_; 
    boost::asio::ip::udp::endpoint sender_endpoint_; 
    enum { max_length = 1024 }; 
    char data_[max_length]; 
}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 3) 
    { 
     std::cerr << "Usage: receiver <listen_address> <multicast_address>\n"; 
     std::cerr << " For IPv4, try:\n"; 
     std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; 
     std::cerr << " For IPv6, try:\n"; 
     std::cerr << " receiver 0::0 ff31::8000:1234\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 
    receiver r(io_service, 
     boost::asio::ip::address::from_string(argv[1]), 
     boost::asio::ip::address::from_string(argv[2])); 
    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 
+0

我不應該使用本地IP。它不是多播ip格式 –

回答

0

我不應該使用本地IP。它不是一個組播IP格式

1

this earlier question,你需要

socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address.to_v4())); 

也就是說,追加.to_v4()ip::address變量。

+0

謝謝。我也做了一些谷歌搜索。此解決方案無法解決我的錯誤。 socket_.set_option(boost :: asio :: ip :: multicast :: join_group(multicast_address.to_v4())); –

+0

@BryanFok當你創建'listen_endpoint'時,你是否也傳遞了'listen_address.to_v4()'?我注意到鏈接的問題使用'udp :: v4()'。 – chrisaycock

+0

剛剛嘗試過。 boost :: asio :: ip :: udp :: endpoint listen_endpoint( \t \t \t listen_address.to_v4(),multicast_port);.同樣的錯誤 –