小编arm*_*rms的帖子

boost asio udp socket async_receive_from不会调用处理程序

我想创建一个自治线程,专门用于使用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)

c++ sockets boost udp boost-asio

6
推荐指数
1
解决办法
8971
查看次数

标签 统计

boost ×1

boost-asio ×1

c++ ×1

sockets ×1

udp ×1