LINUX.ORG.RU

boost ping send_to exception

 , ,


0

2

Привет всем, есть такой кусок кода, взят из документации boost немного подпилен:

pinger::pinger(boost::asio::io_service& io_service, const char* destination, unsigned int srand)
    : m_resolver(io_service), m_socket(io_service, icmp::v4()),
      m_timer(io_service), m_sequence_number(0), m_num_replies(0),m_result(0),m_timeout(5),m_srand(srand)
{
    icmp::resolver::query query(icmp::v4(), destination, "");
    m_destination = *m_resolver.resolve(query);

    int bp = 1;
    setsockopt(m_socket.native(),SOL_SOCKET,SO_BROADCAST,&bp,sizeof(bp));

    start_send();
    start_receive();
}

void pinger::start_send()
{
    std::string body("pingg");

    // Create an ICMP header for an echo request.
    icmp_header echo_request;
    echo_request.type(icmp_header::echo_request);
    echo_request.code(0);
    echo_request.identifier(get_identifier());
    srand(m_srand);
    m_sequence_number = random();
    //echo_request.sequence_number(++sequence_number_);
    echo_request.sequence_number(m_sequence_number);
    compute_checksum(echo_request, body.begin(), body.end());

    // Encode the request packet.
    boost::asio::streambuf request_buffer;
    std::ostream os(&request_buffer);
    os << echo_request << body;

    // Send the request.
    m_time_sent = posix_time::microsec_clock::universal_time();
    m_socket.send_to(request_buffer.data(), m_destination);

    // Wait up to five seconds for a reply.
    m_num_replies = 0;
    m_timer.expires_at(m_time_sent + posix_time::seconds(m_timeout));
    m_timer.async_wait(boost::bind(&pinger::handle_timeout, this));
}

Запускаю его так:

void threadWork::run()
{
    qreal diap = m_hi - m_low;
    volatile quint32 addr;
    try {
        for(quint32 i = m_low; i <= m_hi; ++i)
        {
            QHostAddress current = QHostAddress(i);
            addr = i;
            qDebug() << "Checking IP: " << current.toString();
            qreal delta = i - m_low;
            int percent = (delta / diap) * 100;
            emit percentUpdated(percent);

            boost::asio::io_service service;
            pinger p(service,qPrintable(current.toString()),i);
            p.setTimeout(m_timeout);
            service.run();

            if(p.get_result() > 0)
                emit hostScannedUp(current.toIPv4Address());
        }
    }catch(std::exception& e)
    {
        emit exception(QString(e.what()) + QString(", addr: ") + QHostAddress(addr).toString());
    }
} 

m_hi и m_low => quint32.

Проблема в том, что если запускать несколько объектов threadWork, например 40-50-60, почти всегда через какое-то время вылетает исключение вида

send_to: недопустимый аргумент

Может у кого есть мысли, почему, и как исправить? С бустом только начал разбираться.

★★★★★

Кстати, если сделать так

boost::system::error_code error;
m_socket.send_to(request_buffer.data(), m_destination,0,error);

То error == invalid argument, но исключения нет, его send_to бросает гораздо позже. Странная хрень какая-то.

false ★★★★★
() автор топика
Последнее исправление: false (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.