C++ boost/asio:非常简单的聊天服务器可以';t访问接收到的消息

C++ boost/asio:非常简单的聊天服务器可以';t访问接收到的消息,c++,c++11,visual-c++,boost,boost-asio,C++,C++11,Visual C++,Boost,Boost Asio,我正在学习boost,并在它的服务器和客户机通信中做了一个简单的聊天服务器,客户机发送的任何东西都显示在服务器上。服务器本身不发送任何内容,而是启动接收部分。这很直截了当 服务器代码: #include <boost\asio\placeholders.hpp> #include <boost\bind.hpp> #include <boost\asio\ip\tcp.hpp> #include <boost\asio\io_context.hpp>

我正在学习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;
}
#包括
#包括
#包括
#包括
#包括
类服务器
{
私人:
boost::asio::ip::tcp::socket服务器\u socket;
boost::asio::ip::tcp::endpoint server\u endpoint;
boost::asio::ip::tcp::acceptor-acceptor;
std::字符串msg;
公众:
服务器(boost::asio::io\u上下文和io):
服务器接口(io),
服务器终端(boost::asio::ip::make_地址(“127.0.0.1”),27015),
接受器(io、服务器\终端)
{
acceptor.async\u accept(服务器\u套接字,
boost::bind(&Server::async_acceptor_handler),这个,
boost::asio::占位符::错误);
}
void异步接受程序处理程序(const boost::system::error\u code&ec)
{
如果(!ec)
{

std::cout服务器端的
字符串msg
的大小是多少?它是0。因此服务器总是读取0字节。 当您要读取字符串并调用
buffer::asio::buffer
时,字符串必须具有一定的大小,例如10。这意味着您要将10个字节读入
msg
。您可以调用
msg.resize(10)
(在启动读取操作之前),然后通过
async\u read\u some
将一些数据读入
msg
(可以是1,2字节,随便什么-这是
async\u read\u一些
的工作方式,但最大读取字符数是10)。但这是一个糟糕的解决方案

您正在发送文本,因此您可以考虑将读取数据写入 StruBuf而不是<代码> String ,当您不知道客户端有多少字节时,您可以用定界符调用它,例如可以是新行字符。


另一个解决方案是使用。当数据被添加到字符串中时,您不关心字符串缓冲区的初始大小。但是动态缓冲区不适用于套接字的成员函数,例如
async\u read\u some
,它可以作为自由函数与
async\u read
一起使用。

都德,这是一个完美的答案,谢谢我刚刚查看了字符串文档,它实际上构造了一个零字节的字符串…:O
#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;
}