如何使用boost.asio创建一个简单的服务器/客户端应用程序?

时间:2010-05-03 15:16:54

标签: boost client client-server boost-asio

我正在查看boost.asio的示例,我想知道为什么没有一个简单的服务器/客户端示例的示例在服务器上打印字符串然后将响应返回给客户端。
我试图修改回声服务器,但我无法弄清楚我在做什么。
任何人都可以找到我的客户端模板和服务器模板吗? 我想最终创建一个服务器/客户端应用程序,它接收二进制数据,然后向客户端返回一个确认,即收到数据。
编辑:

void handle_read(const boost::system::error_code& error,
    size_t bytes_transferred) // from the server
{
    if (!error)
    {
        boost::asio::async_write(socket_,
            boost::asio::buffer("ACK", bytes_transferred),
            boost::bind(&session::handle_write, this,
            boost::asio::placeholders::error));
    }
    else
    {
        delete this;
    }
}

这只返回给客户'A' 同样在data_中,我在响应本身后得到了很多奇怪的符号 那是我的问题 编辑2:
好的主要问题是客户端。

size_t reply_length = boost::asio::read(s,
        boost::asio::buffer(reply, request_length));

由于它是一个回声服务器,只有当请求长度超过3个字符时,才会出现'ACK' 我该如何克服这个问题? 我尝试将request_length更改为4,但这只会让客户端等待而不会做任何事情。

2 个答案:

答案 0 :(得分:2)

最终我发现问题在于服务器中的这段代码:

void handle_read(const boost::system::error_code& error,
size_t bytes_transferred) // from the server
{
    if (!error)
    {
        boost::asio::async_write(socket_,
            boost::asio::buffer("ACK", 4), // replaced bytes_transferred with the length of my message 
            boost::bind(&session::handle_write, this,
            boost::asio::placeholders::error));
    }
    else
    {
        delete this;
    }
}

在客户端:

size_t reply_length = boost::asio::read(s,
            boost::asio::buffer(reply, 4)); // replaced request_length with the length of the custom message.

答案 1 :(得分:1)

echo客户端/服务器就是一个简单的例子。你遇到什么问题?客户端应该相当简单,因为它使用阻塞API。服务器稍微复杂一些,因为它使用带回调的异步API。当你把它归结为核心概念(session,server,io_service)时,它很容易理解。