Boost asio发送和接收消息

Boost asio发送和接收消息,boost,boost-asio,Boost,Boost Asio,我正在尝试使用TCP从客户端和服务器发送和接收消息。我正在尝试线程,但我根本不知道如何做到这一点。我可以很好地连接到服务器,但我需要能够根据需要发送和接收来自这两个地方的消息。我已经搜索了好几个小时,结果一无所获,因为谷歌上的所有结果都过于复杂和混乱 struct Client { boost::asio::ip::tcp::socket socket; Client(const char* host = HOST, const char* port = PORT) : socket(io_s

我正在尝试使用TCP从客户端和服务器发送和接收消息。我正在尝试线程,但我根本不知道如何做到这一点。我可以很好地连接到服务器,但我需要能够根据需要发送和接收来自这两个地方的消息。我已经搜索了好几个小时,结果一无所获,因为谷歌上的所有结果都过于复杂和混乱

struct Client
{
boost::asio::ip::tcp::socket socket;

Client(const char* host = HOST, const char* port = PORT) : socket(io_service) 
{
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(HOST, PORT));
    boost::asio::connect(this->socket, endpoint);
   };
};
到目前为止,我只为客户准备了这些

对于服务器:

const int PORT = 52275;

int main()
{
    try
{
    boost::asio::io_service io_service;
    boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), PORT));

    {
        boost::asio::ip::tcp::socket socket(io_service);
        acceptor.accept(socket);
        main();
    }
}
catch (std::exception& e)
{
    std::cerr << "Exception: " << e.what() << std::endl;
}
}
const int PORT=52275;
int main()
{
尝试
{
boost::asio::io_服务io_服务;
boost::asio::ip::tcp::acceptor acceptor(io_服务,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),端口));
{
boost::asio::ip::tcp::socket套接字(io_服务);
接受(套接字);
main();
}
}
捕获(标准::异常&e)
{

std::cerr因为假设您只想通过最简单的方式发送/any/消息显然是安全的:

#include <boost/asio.hpp>

struct Client
{
    boost::asio::io_service& io_service;
    boost::asio::ip::tcp::socket socket;

    Client(boost::asio::io_service& svc, std::string const& host, std::string const& port) 
        : io_service(svc), socket(io_service) 
    {
        boost::asio::ip::tcp::resolver resolver(io_service);
        boost::asio::ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(host, port));
        boost::asio::connect(this->socket, endpoint);
    };

    void send(std::string const& message) {
        socket.send(boost::asio::buffer(message));
    }
};


#include <iostream>

static const int PORT = 52275;

void client_thread() {
    boost::asio::io_service svc;
    Client client(svc, "127.0.0.1", std::to_string(PORT));

    client.send("hello world\n");
    client.send("bye world\n");
}

void server_thread() {
    try
    {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), PORT));

        {
            boost::asio::ip::tcp::socket socket(io_service);
            acceptor.accept(socket);

            boost::asio::streambuf sb;
            boost::system::error_code ec;
            while (boost::asio::read(socket, sb, ec)) {
                std::cout << "received: '" << &sb << "'\n";

                if (ec) {
                    std::cout << "status: " << ec.message() << "\n";
                    break;
                }
            }
        }
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
}

#include <boost/thread.hpp>

int main() {
    boost::thread_group tg;
    tg.create_thread(server_thread);

    boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
    tg.create_thread(client_thread);

    tg.join_all();
}
#包括
结构客户端
{
boost::asio::io_服务和io_服务;
boost::asio::ip::tcp::socket;
客户端(boost::asio::io_服务和svc、std::string const和主机、std::string const和端口)
:io_服务(svc)、套接字(io_服务)
{
boost::asio::ip::tcp::解析器解析器(io_服务);
boost::asio::ip::tcp::resolver::iterator endpoint=resolver.resolve(boost::asio::ip::tcp::resolver::query(主机、端口));
boost::asio::connect(这个->套接字,端点);
};
无效发送(标准::字符串常量和消息){
send(boost::asio::buffer(message));
}
};
#包括
静态常数int端口=52275;
无效客户端线程(){
boost::asio::io_服务svc;
客户端(svc,“127.0.0.1”,std::to_字符串(端口));
client.send(“hello world\n”);
client.send(“bye world\n”);
}
无效服务器线程(){
尝试
{
boost::asio::io_服务io_服务;
boost::asio::ip::tcp::acceptor acceptor(io_服务,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),端口));
{
boost::asio::ip::tcp::socket套接字(io_服务);
接受(套接字);
boost::asio::streambuf sb;
boost::system::error_code ec;
while(boost::asio::read(socket、sb、ec)){

std::cout所有你想在这里解决的结果,你会发现“过于复杂和混乱”。原因很简单,它们也不一定适合你的引用/代码上下文框架。主要原因是:你不共享任何上下文代码。(现在,你是安全的,因为没有人会因为你不喜欢现有的样品而花一个小时为你重新发明其中的一个例子。那将是浪费时间。)我不是要求一个完整的解释来为我重新创建,而是一个简单的例子或解释的沟通。我已经尝试了修改我发现的例子,但所有这些都导致了错误。我不是C++专家,但我不是那么新,我需要为我做的一切。estion,你所要求的东西存在于许多地方。你也可以在这里提出具体的编程问题。那么,告诉我们你在做什么。我们不会在没有任何上下文的情况下去谷歌寻找好的例子。你可以做得更好。我一直致力于在客户端和服务器之间发送消息,并允许回调f要使用的函数。我以前说过。你想得太多了。我已经为代码提供了上下文。我没有要求任何人搜索任何示例,我已经要求某人提供示例或解释,而你继续表现得好像我唯一想做的事情就是让某人为我搜索某样东西。“我可以很好地连接到服务器,但我需要能够根据需要从这两个地方发送和接收消息"你提出了一个非常宽泛、不清楚的问题。如果你需要很多东西,我如何推断你只想发送
n
字节?我不会假设这些东西。谢谢你,这正是我所需要的。我唯一遇到问题的是服务器上的接收回调,这样当服务器收到消息时,它就可以打印消息例如,@TidasBay我相信你。但是,没有服务器。@TidasBay你确实意识到这是一个完全不同的问题,对吗?随便说:。是的,但我想我还是试着在同一个地方把它们都处理掉。我可以处理这些信息,谢谢你的帮助。非常感谢。@TidasBay你可以。N下一次,首先要确保问题的完整性,这样我们才能更切中要害。如果一个问题发生重大变化,发布另一个问题是很好的网络礼仪。干杯