【问题标题】:Boost asio send and receive messagesBoost asio 收发消息
【发布时间】:2014-12-28 00:00:22
【问题描述】:

我正在尝试使用 TCP 从客户端和服务器发送和接收消息。我正在尝试使用线程,但我根本不知道该怎么做。我可以很好地连接到服务器,但我需要能够按需从两个地方发送和接收消息。我已经搜索了好几个小时,结果都是空的,因为 Google 上的所有结果都过于复杂和混乱。

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;
}
}

【问题讨论】:

  • 您在此处请求的所有结果,您会发现“过于复杂和混乱”。原因很简单,它们也不一定适合您的参考/代码上下文框架。这样做的主要原因是:您不共享任何上下文代码。 (现在,您是安全的,因为没有人会花一个小时为您重新发明其中一个示例,只是因为您不喜欢现有的示例。那浪费时间。)
  • 我不是要求为我重新创建一个完整的解释,而是一个简单的例子或沟通的解释。我尝试调整我找到的示例,但所有示例都导致错误。我不是 C++ 方面的专家,但我并不陌生,以至于我需要为我制作的所有东西。 Boost asio 几乎没有文档记录。
  • Really?正如您在问题中提到的那样,您所要求的东西存在于许多地方。 SO 是您提出具体编程问题的地方。所以,告诉我们你被困在什么地方。我们不会在没有任何上下文的情况下使用谷歌搜索好的示例。你可以做得更好。
  • 我无法在客户端和服务器之间发送消息,并允许使用回调函数。我以前说过。你多虑了。我已经给出了代码的上下文。我没有要求任何人谷歌任何示例,我已经要求某人提供示例或解释,而你继续表现得好像我唯一想做的就是让某人为我谷歌一些东西。
  • “我可以很好地连接到服务器,但我需要能够按需从两个地方发送和接收消息” 你提出了一个非常广泛、不清楚的问题.如果你需要很多东西,我怎么能推断你只想发送n字节?我不会假设这样的事情。

标签: boost boost-asio


【解决方案1】:

既然假设您只想以最简单的方式发送 /any/ 消息显然是安全的:

Live On Coliru

#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();
}

【讨论】:

  • 谢谢,这正是我所需要的。我唯一遇到的问题是服务器上的接收回调,例如,当服务器接收到消息时,它可以将消息打印到控制台。
  • @TidasBay 我相信你。然而,没有服务器。
  • @TidasBay 你确实意识到这是一个完全独立的问题,对吧? Anyhoops:Live On Coliru.
  • 是的,但我想我不妨尝试在同一个地方摆脱它们。我可以处理这些信息,感谢您的帮助。不胜感激。
  • @TidasBay 你可以。下一次,首先尝试确保问题是完整的,这样我们就可以更深入地了解这一点。如果一个问题发生了重大变化,那么发布另一个问题是一种很好的网络礼仪。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多