Повышение UDP-многоадресного отправителя не использует правильный порт

Я следую учебному пособию по многоадресной рассылке Boost UDP Вот
. Я изменяю это следующим образом:

#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 сервер
а также клиент
Повысьте предоставленные образцы кодов. Они работают, и указанный порт правильно соблюдается в Wireshark. Может кто-нибудь сказать мне, что пошло не так?

-1

Решение

Член endpoint инициализируется перед членом multicast_portиз-за порядка, в котором они объявлены.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]