【发布时间】:2014-03-21 09:21:18
【问题描述】:
我在使用 boost::asio 库的服务器程序时遇到问题。
Server 类与 boost asio 教程"asynchronous udp-server"中介绍的非常相似
该类有一个公共方法(“sendMessageTo”),由消息处理器对象调用,如果该方法由deadline_timer线程调用,则会发生分段错误。它发生在 new 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 服务器在其上运行。 当定时器第一次被撤销时,message_processor 对象内的 state_handling 方法调用“sendMessageTo”方法,发生分段错误。 “sendMessageTo”的所有参数都是有效的,并且包含预期的值。
我的消息处理器类的构造函数头(称为事务)
Transaction::Transaction(ClientReference *cli, ServerReference *serv)
: timer(*(serv->getIOService()), boost::posix_time::milliseconds(TRANSACTION_THREAD_SLEEP_MILLISEC)),
clientEndpoint(serv->getEndpoint())
timer 是 asio::deadline_timer 对象,clientEndpoint 是 udp::endpoint
服务器响应在 Transaction::runThread() 方法中发送
server->sendMessageTo(&encryptedMsgBuf[0], size, clientEndpoint);
encryptedMsgBuf 是一个 char 数组缓冲区,用于存储加密的消息,它是 Transaction - object 的一部分。
在方法 Transaction::runThread() 结束时,deadline_timer 被调用到方法 runThread() 上以重新激活它,直到达到最终状态:
if (state != done && state != expired)
timer.async_wait(boost::bind(&Transaction::runThread, this));
谢谢你。
【问题讨论】:
-
Server::handleSend()长什么样子? -
也许您应该显示更多代码。想到一个 SSCCE
-
@Stefan
Server::handleSend()只是一个空的回调处理程序。 @sehe,我正在研究 SSCCE,但同时我发现可能是主要问题。更新问题,如有必要,SSCCE 可能会跟进。
标签: c++ boost udp boost-asio