2009-07-26 4 views
0

С следующий классповышение :: ASIO не работает

заголовок:

namespace msgSrv { 

class endPoint { 

public: 
    asio::ip::udp::endpoint ep; 
    endPoint(std::string ip, int port); 

}; 

class msgSrv { 

private: 
    asio::ip::udp::socket *asioSocket; 
    asio::io_service *asioIoService; 
    int listenPort; 
    boost::array<char, 1> rcvBuff; 
    asio::ip::udp::endpoint lastRcvdPcktEndp; 
    char * sbuff; 

public: 

    boost::condition_variable cond; 
    boost::mutex mut; 
    msgSrv(int listenPort); 
    virtual ~msgSrv(); 

    void start(); 
    void pckRcvd(const asio::error_code& error, std::size_t bytes_transferred); 
    void sendTo(const char* buff, int len, endPoint ep); 
    void sendHnd(const asio::error_code& error, std::size_t bytes_transferred); 

}; 

} 

.cpp

#include "msgSrv.h" 

namespace msgSrv { 

endPoint::endPoint(const std::string ip, int port) { 
    asio::ip::address addr = asio::ip::address::from_string(ip); 
    ep = asio::ip::udp::endpoint(addr, port); 
} 

msgSrv::msgSrv(int listenPort) { 
    // TODO Auto-generated constructor stub 
    this->listenPort = listenPort; 
    try { 
     asioIoService = new asio::io_service(); 
     asioSocket = new asio::ip::udp::socket(*asioIoService, 
       asio::ip::udp::endpoint(asio::ip::udp::v4(), listenPort)); //new asio::ip::udp::socket_(*asioIoService, udp::endpoint(udp::v4(), listenPort)); 
    } catch (std::exception &e) { 
     std::cerr << "Error initializing ioservice or socket:" << e.what(); 
    } 
    asioIoService->run(); 

} 

msgSrv::~msgSrv() { 
    // TODO Auto-generated destructor stub 
    delete asioIoService; 
    delete asioSocket; 
} 

void msgSrv::start() { 

    asioSocket->async_receive_from(asio::buffer(rcvBuff), lastRcvdPcktEndp, 
      boost::bind(&msgSrv::pckRcvd, this, asio::placeholders::error, 
        asio::placeholders::bytes_transferred)); 

} 

void msgSrv::pckRcvd(const asio::error_code& error, 
     std::size_t bytes_transferred) { 
    std::cout << "Rcvd! " << lastRcvdPcktEndp.address().to_string() << ":" 
      << lastRcvdPcktEndp.port() << "\n"; 
} 

void msgSrv::sendTo(const char* buff, int len, endPoint ep) { 
    sbuff = new char[len]; 
    mempcpy(sbuff, buff, len); 
    asioSocket->async_send_to(asio::buffer(sbuff, len), ep.ep, boost::bind(
      &msgSrv::sendHnd, this, asio::placeholders::error, 
      asio::placeholders::bytes_transferred)); 

} 

void msgSrv::sendHnd(const asio::error_code& error, 
     std::size_t bytes_transferred) { 
    std::cout << "Snt!\n"; 

    delete sbuff; 
} 

} 

и следующий "главный" файл:

int main() 
{ 
    msgSrv::msgSrv aa(4450); 
    aa.start(); 
    msgSrv::endPoint ep("127.0.0.1", 4450); 
    std::string a("Prova!"); 
    int len = a.length(); 
    aa.sendTo(a.c_str(), len, ep); 
    std::cout << "sent...\n"; 
    std::cout << "notified...\n"; 
} 

все, что у меня есть:

terminate called after throwing an instance of 'asio::system_error' 
    what(): mutex: Invalid argument 
sent... 
notified... 

Что случилось? Я попробовал даже положить некоторое время (1) в основном, чтобы увидеть, что-то происходит ... Я даже попытался поставить условие в основном, которое разблокировано обработчиком приема ... все остается заблокированным ... Так что ??? Без понятия!

ответ

1

Я не вижу, чтобы вы фактически блокировали какой-либо muxtex, так что ошибка странная.

Однако ваша проблема заключается в вызове asioIoService->run() внутри конструктора, ведьма попадает в бесконечный цикл. Решение состоит в том, чтобы создать новый boost::thread, вызов ведьмы asioIoService->run(). Этот поток будет обрабатывать все задания. Вы также можете вызвать asio :: io_service :: run() с более чем одним потоком, чтобы одновременно обрабатывать более одного задания.

m_thread = new boost::thread(boost::bind(&asio::io_service::run,asioIoService)); 

Вызов asioIoService->stop() заставит выйти из ASIO :: io_service :: Run(), тем самым замыкая нить. Вы должны присоединиться к этому потоку, чтобы гарантировать, что поток завершится до уничтожения указателя asioIoService в деструкторе вашего класса msgSrv.

+3

мой учитель языка 7-го класса избил всех нас шипами, пока мы не получили это правильно ... ведьма носит черную шляпу ... которая предназначена для выбора. Всегда заклинайте это как то, и вы будете правы в 90% случаев. –

Смежные вопросы