gpt4 book ai didi

c++ - boost tcp_server async_write 错误 : access violation writing location

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:10 24 4
gpt4 key购买 nike

我一直在尝试使用 boost 实现一个简单的 tcp 服务器,它接受客户端连接,并通过调用服务器公开的方法将一些信息发送回客户端。

这是我根据 Boost 教程创建的类:

#define WIN32_LEAN_AND_MEAN

#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;


#include <ctime>
#include <iostream>
#include <string>

#include "Logger.h"



class tcp_server_connection
: public boost::enable_shared_from_this<tcp_server_connection>
{
public:
typedef boost::shared_ptr<tcp_server_connection> pointer;

static pointer create(boost::asio::io_service& io_service)
{
return pointer(new tcp_server_connection(io_service));
}

tcp::socket& socket()
{
return socket_;
}

void start(string message)
{
swap(m, message);

boost::asio::async_write(socket_, boost::asio::buffer(m),
boost::bind(&tcp_server_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

private:
tcp_server_connection(boost::asio::io_service& io_service)
: socket_(io_service)
{
Logger::Log("main.log", "New TCP Server Connection");
}


void handle_write(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (error) {
Logger::Log("main.log", "TCP Server Write Error: ");
}
}

tcp::socket socket_;
string m;
};

class tcp_server
{
public:
tcp_server(boost::asio::io_service& io_service, int port)
: acceptor_(io_service, tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), port))
{
start_accept();
}

void write(string message) {
connection->start(message);
}

private:
void start_accept()
{
connection = tcp_server_connection::create(acceptor_.get_io_service());

acceptor_.async_accept(connection->socket(),
boost::bind(&tcp_server::handle_accept, this, connection,
boost::asio::placeholders::error));
}

void handle_accept(tcp_server_connection::pointer new_connection,
const boost::system::error_code& error)
{
if (!error)
{
Logger::Log("main.log", "TCP Server Accepted Connection");
}
else {
Logger::Log("main.log", "TCP Server Error accepting Connection");
}
}

tcp::acceptor acceptor_;
tcp_server_connection::pointer connection;
};

我通过使用此方法启动线程来启动服务器:

void SetupServer() {
boost::asio::io_service io_service;
server = new tcp_server(io_service, serverPort);
io_service.run();
}

当我想向客户端写一些东西时,我会调用 server->write("Some Text"),但是async_write 引发异常并显示“访问冲突写入位置”。我相信可能有一些对象在它应该被清理之前就被清理了,但我不明白为什么以及在哪里,所以如果有人能给我一些关于为什么会发生这种情况以及如何解决它的见解,我将不胜感激。

提前感谢您的帮助。

最佳答案

好吧,我发现这个问题与 io_service 变量在作用域更改时被释放有关,而 hell 正在崩溃。

为了解决这个问题,我将 setupServer 更改为:

io_service = new boost::asio::io_service();
rankingServer = new tcp_server(*io_service, serverPort);
io_service->run();

并在使用它的类中的其他地方声明该变量:

boost::asio::io_service *io_service = NULL;

记住变量需要释放,调用

delete io_service;

希望这可能对某人有所帮助。

关于c++ - boost tcp_server async_write 错误 : access violation writing location,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25488358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com