繁体   English   中英

boost :: asio读/写问题

[英]boost::asio read/write trouble

我开始学习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:我发现在第一次迭代中,读/写操作的错误代码均成功。 但是(!)在第二次迭代中发生异常的地方,错误代码是“文件末尾”。 但为什么?

由于连接的远程端关闭或断开了连接,因此出现文件结尾情况。

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

生活在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";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM