我正在学习boost,并且搞乱了它与服务器和客户端的通信,以创建一个简单的聊天服务器,客户端发送的任何内容都只显示在服务器上。服务器本身不发送任何内容,而是启动接收部分。这很简单。
服务器代码:
#include <boost\asio\placeholders.hpp>
#include <boost\bind.hpp>
#include <boost\asio\ip\tcp.hpp>
#include <boost\asio\io_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 <boost\asio\placeholders.hpp>
#include <boost\bind.hpp>
#include <boost\asio\ip\tcp.hpp>
#include <boost\asio\io_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可能是我的问题,因为我尚未检查等待功能和其他使服务器等待的调用。如果您可以在这方面指导我,那将非比神奇。但是主要问题是问题的第二部分,因为我不知道为什么服务器始终不接收来自客户端的任何信息。
PS:这是一个不完整的代码,我打算对其进行更多处理,因此,如果存在一些重大缺陷,请告诉我...:)
答案 0 :(得分:1)
服务器端string msg
的大小是多少? 它是0 。因此,服务器始终读取0个字节。
当您想读取字符串并调用buffer::asio::buffer
时,字符串必须具有一定的大小,例如10。这意味着您想将10个字节读取到msg
中。您可以调用msg.resize(10)
(在启动读取操作之前),然后msg
会将一些数据读入async_read_some
(无论如何,它可以是1,2个字节-{{ 1}}有效,但最大读取字符为10)。但这是糟糕的解决方案。
您正在发送文本,因此当您不知道来自客户端的字节数时,可以考虑将读取的数据用于async_read_some
而不是streambuf
中。然后,您可以使用定界符调用async_read_until-例如,可以使用换行符。
另一种解决方案是使用dynamic buffer。数据被添加到字符串中的位置,您不必关心字符串缓冲区的初始大小。但是动态缓冲区无法与string
之类的套接字成员函数一起使用,它可以与async_read_some
一起用作自由函数。