Boost UDP 多播发件人未使用正确的端口
Boost UDP multicast sender not using correct port
我正在关注 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 可以正确观察到指定的端口。谁能告诉我哪里出了问题?
成员 endpoint
在成员 multicast_port
之前初始化,因为它们的声明顺序。
我正在关注 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 可以正确观察到指定的端口。谁能告诉我哪里出了问题?
成员 endpoint
在成员 multicast_port
之前初始化,因为它们的声明顺序。