增强UDP组播发送方不使用正确的端口

时间:2018-03-04 00:20:08

标签: c++ boost udp multicast sender

我正在关注Boost UDP多播发送器教程here 。我把它修改为如下:

#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>
using boost::asio::ip::udp;
using std::cout;
using std::cin;
using std::endl;

class sender
{
private:
    boost::asio::ip::udp::endpoint endpoint_;
    boost::asio::ip::udp::socket socket_;
    boost::asio::steady_timer timer_;
    int message_count_;
    std::string message_;
    short multicast_port = 13000;
    int max_message_count = 10;

public:
    sender(boost::asio::io_context& io_context, const boost::asio::ip::address& multicast_address)
        : endpoint_(multicast_address, multicast_port),
        socket_(io_context, endpoint_.protocol()),
        timer_(io_context),
        message_count_(0)
    {
        send_periodic();
    }

private:
    void send_periodic()
    {
        static int i = 0;
        message_ = some_string();

        socket_.async_send_to(boost::asio::buffer(message_), endpoint_, [this](boost::system::error_code ec, std::size_t /*length*/)
        {
            //cout << i << endl;    // show count
            cout << i << " - " << message_; // show  count
            ++i;
        });

        timer_.expires_after(std::chrono::seconds(1));
        timer_.async_wait([this](boost::system::error_code ec)
        {
            send_periodic();
        });
    }

    std::string make_daytime_string()
    {
        using namespace std; // For time_t, time and ctime;
        time_t now = time(0);
        return ctime(&now);
    }

    std::string some_string()
    {
        std::string result;
        // ====================================================
        //result = "abcd";
        // ====================================================
        //os << "Message " << message_count_++;
        //result = os.str();
        // ====================================================
        //std::stringstream ss;
        //ss << i;
        //result = ss.str();
        // ====================================================
        result = make_daytime_string();

        return result;
    }
};

int main(int argc, char* argv[])
{
    // ============================================================================================================
    try
    {
        boost::asio::io_context io_context;
        //sender s(io_context, boost::asio::ip::make_address("127.0.0.1"));     // doesn't work, why?
        sender s(io_context, boost::asio::ip::make_address("239.255.0.1"));
        io_context.run();
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}    

端口设置为13000.我使用Wireshark检查它。它向我显示包的发送源端口为62910,目标端口为0.此外,从网络上的另一台计算机看不到包。

我之前测试过单播UDP时间server  和client  Boost提供了示例代码。它们工作,并且使用Wireshark正确观察指定的端口。有人能告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

成员endpoint在成员multicast_port之前初始化,因为它们的声明顺序。