【问题标题】:boost::asio read/write troubleboost::asio 读/写问题
【发布时间】:2015-02-12 20:30:53
【问题描述】:

我开始学习 boost::asio 并尝试制作简单的客户端-服务器应用程序。现在我的服务器有问题。代码如下:

int main(int argc, char* argv[])
{
    using namespace boost::asio;

    io_service service;
    ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
    ip::tcp::acceptor acc(service, endp);

    for (;;)
    {
        socker_ptr sock(new ip::tcp::socket(service));
        acc.accept(*sock);
        for (;;)
        {
            byte data[512];

            size_t len = sock->read_some(buffer(data));  // <--- here exception at second iteration

            if (len > 0)
                write(*sock, buffer("ok", 2));
        }
    }
}

它正确接受客户端套接字,正确读取,然后写入数据并开始新的迭代。在第二次迭代中抛出异常。看起来像: 我不明白为什么会这样? 我只需要服务器必须在客户端存在时连续读/写。当客户端离开时,服务器必须接受下一个客户端。

所以主要问题是:为什么会发生异常以及如何避免它?

...

UPDATE1:我发现在第一次迭代时,读/写操作的错误代码都是成功的。但是(!)在异常重新出现的地方的第二次迭代中,错误代码是“文件结束”。但为什么?

【问题讨论】:

  • 您应该将缓冲区的最大大小 (512) 作为第二个参数传递给 read_some 的缓冲区。我怀疑这是根本原因,但是缓冲区没有合理的方法来确定字节数组的长度。
  • 嗯,这无济于事。我注意到第一次迭代完全通过了,但在第二次迭代中它失败了。我尝试添加缓冲区“size_t len = sock->read_some(buffer(data, 512));”的大小。但这没有帮助。问题依然存在。
  • @sehe:#tmyk!感谢您指出了这一点。我不知道编译器有一种技术可以自动检测数组中的元素数量。我的立场是正确的。
  • 干杯 :) 我花了数年时间学习这些东西,除此之外,真的很棒。

标签: c++ boost boost-asio


【解决方案1】:

您得到文件结束条件,因为连接的远程端关闭或断开连接。

您应该处理系统错误,或使用引用boost::system::error_code 的重载。否则你会如何终止无限循环?

Live On Coliru

#include <boost/asio.hpp>
#include <iostream>

int main()
{
    using namespace boost::asio;

    io_service service;
    ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
    ip::tcp::acceptor acc(service, endp);

    for (;;)
    {
        ip::tcp::socket sock(service);
        acc.accept(sock);
        boost::system::error_code ec;

        while (!ec)
        {
            uint8_t data[512];

            size_t len = sock.read_some(buffer(data), ec);

            if (len > 0)
            {
                std::cout << "received " << len << " bytes\n";
                write(sock, buffer("ok", 2));
            }
        }

        std::cout << "Closed: " << ec.message() << "\n";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多