Привет всем, есть такой кусок кода, взят из документации 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: недопустимый аргумент
Может у кого есть мысли, почему, и как исправить? С бустом только начал разбираться.