我正在为Orbiter 空间模拟器编写一个 DLL 插件,它允许与外部系统进行 UDP 通信。我为任务选择了 boost::asio,因为它允许我从低级的东西中抽象出来。
“边界条件”如下:
- 我可以从我的 DLL 创建任何线程或调用任何 API 函数
- 由于缺乏其他线程安全性,我只能在传递给我的 DLL(每帧)的回调中修改模拟内部的数据。
因此,我为用于通信的 NetworkClient 类选择了以下架构:
- 在构造时,它会初始化 UDP 套接字(boost::socket+boost::io_service)并启动一个线程,该线程调用 io_service.run()
- 传入消息被异步放入队列(通过 CriticalSection 线程安全)
- 回调处理函数可以从队列中拉取消息并进行处理
但是,我在运行实现时遇到了一些奇怪的异常: boost::exception_detail::clone_impl > at memory location 0x01ABFA00。
io_service.run() 调用中出现异常。
任何人都可以指点我,拜托,我错过了什么吗?我的课程的代码清单如下。
NetworkClient 声明:
class NetworkClient {
public:
NetworkClient(udp::endpoint server_endpoint);
~NetworkClient();
void Send(shared_ptr<NetworkMessage> message);
inline bool HasMessages() {return incomingMessages.HasMessages();};
inline shared_ptr<NetworkMessage> GetQueuedMessage() {return incomingMessages.GetQueuedMessage();};
private:
// Network send/receive stuff
boost::asio::io_service io_service;
udp::socket socket;
udp::endpoint server_endpoint;
udp::endpoint remote_endpoint;
boost::array<char, NetworkBufferSize> recv_buffer;
// Queue for incoming messages
NetworkMessageQueue incomingMessages;
void start_receive();
void handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred);
void handle_send(boost::shared_ptr<std::string> /*message*/, const boost::system::error_code& /*error*/, std::size_t /*bytes_transferred*/) {}
void run_service();
NetworkClient(NetworkClient&); // block default copy constructor
};
方法实现:
NetworkClient::NetworkClient(udp::endpoint server_endpoint) : socket(io_service, udp::endpoint(udp::v4(), 28465)) {
this->server_endpoint = server_endpoint;
boost::thread* th = new boost::thread(boost::bind(&NetworkClient::run_service,this));
start_receive();
}
void NetworkClient::start_receive()
{
socket.async_receive_from(boost::asio::buffer(recv_buffer), remote_endpoint,
boost::bind(&NetworkClient::handle_receive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
);
}
void NetworkClient::run_service()
{
this->io_service.run();
}