【发布时间】:2018-12-06 19:06:56
【问题描述】:
我正在尝试使用 BOOST::ASIO 在 UDP 中实现一些保活服务,这些是一般步骤:
向同一台机器上的 2 个进程发送 keep-alives,它们正在使用不同的端口侦听同一个 ip。
循环向两者发送 async_send_to,回调是一个函数,它使用回调 F() 调用 async_receive_from。 两者都引用相同的端点和数据缓冲区。
内部带有 io_service.run_one() 的 while 循环。
进程立即回复。
问题是,当我检查端点的端口(通缉的情况)F() 运行时,我偶尔会得到 2 个不同的端口,或者,我会得到两个相同的端口。
似乎端点缓冲区(可能还有数据)被后面的数据包覆盖了。
我在想,因为我使用的是 run_one(),所以数据包应该一个一个地处理,不会有覆盖。
初始发送 -
void GetInstancesHeartbeat(udp::endpoint &sender_endpoint)
{
int instanceIndex = 0;
for (; instanceIndex <= amountOfInstances ; instanceIndex++)
{
udp::endpoint endpoint = udp::endpoint(IP, Port+ instanceIndex);
m_instancesSocket->async_send_to(
boost::asio::buffer((char*)&(message),
sizeof(message)),endpoint,
boost::bind(&ClusterManager::handle_send_to_instance,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sender_endpoint));
}
}
然后是处理程序 -
void handle_send_to_instance(const boost::system::error_code& error, size_t
bytes_recvd, udp::endpoint &sender_endpoint)
{
m_instancesSocket->async_receive_from(
boost::asio::buffer(m_dataBuffer, m_maxLength), m_endpoint,
boost::bind(&ClusterManager::handle_receive_from_instance, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
sender_endpoint));
}
While 循环 -
while(true){
io_service.run_one();
}
句柄接收端口结果两次相同的地方-
void handle_receive_from_instance(const boost::system::error_code& error, size_t
bytes_recvd, udp::endpoint&sender_endpoint)
{
if (!error && bytes_recvd > 0)
{
int instancePort = m_endpoint.port();
} else {
//PRINT ERROR
}
}
【问题讨论】:
标签: c++ sockets udp boost-asio