【发布时间】:2018-06-25 17:13:59
【问题描述】:
我正在尝试使用 Boost.Asio 库编写一个简单的服务器。我希望我的服务器从客户端接收消息并在控制台上打印该消息。这是我的服务器程序的代码:
#include <iostream>
#include <string>
#include <memory>
#include <boost/asio.hpp>
using namespace boost::asio;
using namespace boost::system;
using boost::asio::ip::tcp;
class Session : public std::enable_shared_from_this<Session> {
public:
Session(tcp::socket socket);
void start();
private:
tcp::socket socket_;
std::string data_;
};
Session::Session(tcp::socket socket) : socket_(std::move(socket))
{}
void Session::start()
{
socket_.async_read_some(buffer(data_), [this](error_code errorCode, size_t length) {
if (!errorCode) {
std::cout << "received: " << data_ << std::endl;
}
start();
});
}
class Server {
public:
Server(io_context& context);
private:
tcp::acceptor acceptor_;
void accept();
};
Server::Server(io_context& context) : acceptor_(context, tcp::endpoint(tcp::v4(), 8888))
{
accept();
}
void Server::accept()
{
acceptor_.async_accept([this](error_code errorCode, tcp::socket socket) {
if (!errorCode) {
std::make_unique<Session>(std::move(socket))->start();
}
accept();
});
}
int main()
{
boost::asio::io_context context;
Server server(context);
context.run();
return 0;
}
这是我的客户端程序的代码:
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost::asio;
using boost::asio::ip::tcp;
int main()
{
io_context context;
tcp::socket socket(context);
tcp::resolver resolver(context);
connect(socket, resolver.resolve("127.0.0.1", "8888"));
while (true) {
try {
std::string data;
std::cin >> data;
write(socket, buffer(data));
} catch (const std::exception& exception) {
std::cerr << exception.what() << std::endl;
}
}
return 0;
}
但是当我启动客户端时,服务器抛出异常“读取访问冲突”。我做错了什么?
【问题讨论】:
-
调试器中该消息的一部分将包括堆栈跟踪。看看那个,它会告诉你到底发生了什么。 (如果我是一个赌徒,它将围绕 boost::buffer(string) 调用 - 它试图写入无效内存。stackoverflow.com/questions/4068249/…
-
从我的
start()调用的buffer()函数引发了异常。 -
重新阅读链接 .... 你会发现它是重复的(你会发现用 std::string 创建可变缓冲区并没有真正起作用 - 使用 std::向量代替)
-
感谢您的评论!我已将
std::string data_;更改为std::vector<char> data_ = std::vector<char>(1024);和buffer(data_)更改为buffer(data_, 1024),但现在它在调试断言上失败,显示消息“vector iterator not dereferencable”。 -
“调试器中该消息的一部分将包括堆栈跟踪。看看它,它会告诉你到底发生了什么”不同的错误 - 不同的堆栈跟踪......第一次给出完整的细节你会在更好的时间得到答案......但实际上,你应该练习查看它并了解出了什么问题。我猜它现在可能在不同的地方失败了。可能是因为数据的大小为 1024,但只写入了长度字节。
标签: c++ client-server boost-asio