Я пытаюсь внедрить некоторую службу поддержки активности в UDP с помощью BOOST :: ASIO, это общие шаги:
Отправка сообщений активности двум процессам на одной машинеони прослушивают один и тот же ip с другим портом.
Цикл для отправки async_send_to обоим, и обратный вызов - это функция, которая вызывает async_receive_from с обратным вызовом F ().Оба ссылаются на одну и ту же конечную точку и буферы данных.
в то время как цикл с io_service.run_one () внутри.
Процессы отвечают немедленно.
Проблема в том, что время от времени я либо получаю 2 разных порта, когда проверяю порты конечных точек (требуемый случай) F (), либо получаю дважды один и тот же порт.
Этопохоже, что буфер конечной точки (и, вероятно, данные) перезаписывается последним пакетом.
Я думал, так как я использую 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(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
}
}