У меня возникли проблемы с серверной программой, используя библиотеку boost :: asio.Ошибка сегментации с boost :: asio, асинхронный udp-сервер с deadline_timer
Класс Сервер очень похож на тот, представленный в форсированный ASIO учебник "asynchronous udp-server"
Класс имеет публичный метод («sendMessageTo»), который вызывается сообщением - объект процессора, то здесь ошибки сегментации возникает, если метод вызывается потоком deadline_timer. Это происходит с вызовом новой std :: string (msg, len), это меня озадачивает. msg содержит то, что он должен содержать, и len тоже.
void Server::sendMessageTo(const char* msg, size_t len, udp::endpoint to)
{
boost::shared_ptr<std::string> message(new std::string (msg,len));
socket.async_send_to(boost::asio::buffer(*message), to,
boost::bind(&Server::handleSend, this, message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
Когда метод «sendMessageTo» вызывается с первой попытки, то все работает отлично: Это называется позже в том же потоке, который открывается с помощью метода «handleReceive» класса сервера.
Мой объект обработки сообщений - это своего рода машина состояний, которая поддерживает удаленную конечную точку, а в некоторых состояниях периодически хочет отправить некоторые сообщения udp обратно в конечную точку. Для этого используется asio :: deadline_timer. Таймер таймера создается с тем же io_service, udp-server работает. Когда таймер отменяется в первый раз, метод state_handling внутри объекта message_processor вызывает метод sendMessageTo, при котором возникает ошибка сегментации. Все аргументы «sendMessageTo» действительны и содержат ожидаемые значения.
Конструктор головки моего сообщения, процессор класса (называемый Transaction)
Transaction::Transaction(ClientReference *cli, ServerReference *serv)
: timer(*(serv->getIOService()), boost::posix_time::milliseconds(TRANSACTION_THREAD_SLEEP_MILLISEC)),
clientEndpoint(serv->getEndpoint())
таймер является ASIO :: deadline_timer объект, и clientEndpoint является УДП :: конечная точка
ответ сервера посылается внутри метода транзакции :: runThread()
server->sendMessageTo(&encryptedMsgBuf[0], size, clientEndpoint);
encryptedMsgBuf представляет собой буфер массив символов, который хранит зашифрованное сообщение, и оно является частью Tra nsaction - объект.
в конце метода транзакции :: runThread() для deadline_timer называется на метод runThread(), чтобы активировать его, пока конечное состояние не будет достигнуто:
if (state != done && state != expired)
timer.async_wait(boost::bind(&Transaction::runThread, this));
Спасибо преимущество.
Что такое 'Server :: handleSend()' похоже? –
Возможно, вам стоит показать больше кода. SSCCE приходит на ум – sehe
@Stefan 'Server :: handleSend()' просто пуст обработчик обратного вызова. @sehe, я работал над SSCCE, но пока что узнал, какова может быть основная проблема. Обновление вопроса, возможно, SSCCE последует, если необходимо. – mburrows2703