我想创建一个自治线程,专门用于使用boost库(asio)从UDP套接字接收数据.该线程应该是由UDP套接字接收的一些数据触发的无限循环.在我的应用程序中,我需要使用异步接收操作.
如果我使用同步函数receive_from,一切都按预期工作.
但是,如果我使用async_receive_from,则永远不会调用处理程序.由于我使用信号量来检测是否已收到某些数据,因此程序会锁定并且永远不会触发循环.
我已经验证(使用网络分析器)发送方设备正确地在UDP套接字上发送数据.
我已在以下代码中隔离了该问题.
#include <boost\array.hpp>
#include <boost\asio.hpp>
#include <boost\thread.hpp>
#include <boost\interprocess\sync\interprocess_semaphore.hpp>
#include <iostream>
typedef boost::interprocess::interprocess_semaphore Semaphore;
using namespace boost::asio::ip;
class ReceiveUDP
{
public:
boost::thread* m_pThread;
boost::asio::io_service m_io_service;
udp::endpoint m_local_endpoint;
udp::endpoint m_sender_endpoint;
udp::socket m_socket;
size_t m_read_bytes;
Semaphore m_receive_semaphore;
ReceiveUDP() :
m_socket(m_io_service),
m_local_endpoint(boost::asio::ip::address::from_string("192.168.0.254"), 11),
m_sender_endpoint(boost::asio::ip::address::from_string("192.168.0.11"), 5550),
m_receive_semaphore(0)
{
Start();
}
void Start()
{
m_pThread = new boost::thread(&ReceiveUDP::_ThreadFunction, this);
}
void _HandleReceiveFrom(
const boost::system::error_code& error,
size_t received_bytes)
{
m_receive_semaphore.post();
m_read_bytes = received_bytes;
}
void _ThreadFunction()
{
try
{
boost::array<char, 100> recv_buf; …Run Code Online (Sandbox Code Playgroud)