我正在关注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正确观察指定的端口。有人能告诉我出了什么问题吗?
答案 0 :(得分:1)
成员endpoint
在成员multicast_port
之前初始化,因为它们的声明顺序。