boost/asio:非常简单的聊天服务器无法访问收到的消息
boost/asio: Very simple chat server can't access the messages that are recieved
我正在学习boost,并弄乱了它的服务器和客户端通信,以制作一个简单的聊天服务器,其中客户端发送的任何内容都只显示在服务器上。服务器本身不发送任何内容并启动接收部分。这是非常简单的。
服务器代码:
#include <boostasioplaceholders.hpp>
#include <boostbind.hpp>
#include <boostasioiptcp.hpp>
#include <boostasioio_context.hpp>
#include <iostream>
class Server
{
private :
boost::asio::ip::tcp::socket server_socket;
boost::asio::ip::tcp::endpoint server_endpoint;
boost::asio::ip::tcp::acceptor acceptor;
std::string msg;
public :
Server(boost::asio::io_context &io) :
server_socket(io),
server_endpoint(boost::asio::ip::make_address("127.0.0.1"), 27015),
acceptor(io, server_endpoint)
{
acceptor.async_accept(server_socket,
boost::bind(&Server::async_acceptor_handler, this,
boost::asio::placeholders::error));
}
void async_acceptor_handler(const boost::system::error_code &ec)
{
if (!ec)
{
std::cout << "One client connected...n";
server_socket.async_read_some(boost::asio::buffer(msg),
boost::bind(&Server::async_read_some_handler, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "async_acceptor failed with error code : " << ec.value() << std::endl;
std::cout << "Error description : " << ec.message() << std::endl;
}
}
void async_read_some_handler(const boost::system::error_code &ec)
{
if (!ec)
{
std::cout << msg << std::endl;
server_socket.async_read_some(boost::asio::buffer(msg),
boost::bind(&Server::async_read_some_handler, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "async_acceptor failed with error code : " << ec.value() << std::endl;
std::cout << "Error description : " << ec.message() << std::endl;
}
}
};
int main()
{
boost::asio::io_context io;
Server s(io);
io.run();
return 0;
}
在客户端部分,它又是一个非常简单的代码,只需连接到服务器并开始从用户那里获取输入并发送到服务器。
客户端代码:
#include <boostasioplaceholders.hpp>
#include <boostbind.hpp>
#include <boostasioiptcp.hpp>
#include <boostasioio_context.hpp>
#include <iostream>
class Client
{
private :
boost::asio::ip::tcp::socket client_socket;
boost::asio::ip::tcp::endpoint server_endpoint;
std::string msg;
public :
Client(boost::asio::io_context &iocontext) :
client_socket(iocontext),
server_endpoint(boost::asio::ip::make_address("127.0.0.1"), 27015)
{
//connect to server endpoint
client_socket.async_connect(server_endpoint,
boost::bind(&Client::async_connect_handler, this,
boost::asio::placeholders::error));
}
void async_connect_handler(const boost::system::error_code &ec)
{
if (!ec)
{
std::cout << "Connected to chat server...n";
//wait for user input
std::cin >> msg;
std::cout << "rC : " << msg << std::endl;
client_socket.async_write_some(boost::asio::buffer(msg),
boost::bind(&Client::async_write_some_handler, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "async_connect failed with error code : " << ec.value() << std::endl;
std::cout << "Error description : " << ec.message() << std::endl;
}
}
void async_write_some_handler(const boost::system::error_code &ec)
{
//wait for user input
std::cin >> msg;
std::cout << "rC : " << msg << std::endl;
client_socket.async_write_some(boost::asio::buffer(msg),
boost::bind(&Client::async_write_some_handler, this,
boost::asio::placeholders::error));
}
};
int main()
{
boost::asio::io_context io;
Client c(io);
io.run();
return 0;
}
现在的问题是:
它工作正常,也可以连接到服务器。我得到正确的"已连接到聊天服务器..."在客户端和"一个客户端已连接..."在服务器中。之后出现问题:
- 在服务器控制台中,在"一个客户端"消息之后,它只是开始不打印任何内容并继续运行。
- 客户端发送的消息永远不会显示在服务器控制台中。
问题 1 可能是我的问题,因为我尚未检查等待函数和其他使服务器等待的调用。如果你能指导我,那将是惊人的。但主要问题是问题的第 2 部分,因为我不知道为什么服务器总是从客户端接收到任何东西。
PS:这是一个不完整的代码,我打算多玩一点,所以,如果有一些重大缺陷,请告诉我...... :)
PPS:在你说检查其他类似的问题之前,我浏览了所有类似的问题。例如:这个和这个,但这无关紧要。
服务器端string msg
的大小是多少?它是 0。因此,服务器始终读取 0 个字节。 当您要读取字符串并调用字符串时buffer::asio::buffer
字符串必须具有一定的大小,例如 10。这意味着您想将 10 个字节读入msg
.您可以调用msg.resize(10)
(在启动读取操作之前),然后一些数据将被async_read_some
读入msg
(它可以是 1,2 字节,无论如何 - 这是async_read_some
的工作方式,但最大读取字符数为 10)。但这是一个糟糕的解决方案。
您正在发送文本,因此当您不知道客户端可以有多少字节时,您可以考虑使用读取数据streambuf
而不是string
。然后你可以用分隔符调用async_read_until - 它可以是例如换行符。
另一种解决方案是使用动态缓冲区。将数据追加到字符串中,而不关心字符串缓冲区的初始大小。但是动态缓冲区不适用于像async_read_some
这样的套接字的成员函数,它可以与async_read
一起使用作为自由函数。
- 通过方法访问结构
- boost::进程间消息队列引发错误
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 使用加速进程间创建消息队列 - 内存访问冲突
- boost/asio:非常简单的聊天服务器无法访问收到的消息
- MFC编辑控制消息处理访问文档对象
- 从 ICMP 消息访问 UDP
- 不是NULL指针,而是错误的访问错误消息
- 是否可以进行编译,以使错误的std::vector访问调用退出程序,并显示有用的错误消息
- Zeromq:如何在 c++ 中访问 tcp 消息
- 从C程序访问C++函数时,收到错误消息"Access violation reading location"
- 如何使用消息访问 MFC 控件
- 我已经在静脉中创建了扩展的短波消息,如何在traciemo中访问它
- 如何将消息/事件从没有直接访问的地方推送到消息队列中
- 访问未定义的子类型时出现自定义编译错误消息
- 为什么我不能在c++中访问我的私有变量和getter和setter消息
- 删除动态创建的二维数组时出现访问冲突消息