c++ - boost::asio 读/写问题

标签 c++ boost boost-asio

我开始学习 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));
        }
    }
}

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

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

...

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

最佳答案

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

您应该处理系统错误,或使用引用 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";
    }
}

关于c++ - boost::asio 读/写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487188/

相关文章:

android - 如何在 C++ 中为 Android 和 iOS 创建共享库?

C++,boost::numeric::ublas::mapped_matrix - 使用 std::tr1::unordered_map 而不是 std::map 时的迭代问题

c++ - 传递 boost::shared_ptr 引用的安全性

c++ - 将 unique_ptr 引用传递给 boost::bind?

c++ - boost::asio async_read_some 示例代码未读取套接字中的所有数据

c++ - 我如何将 boost::asio 用于 TCP 协议(protocol)而没有 header 告诉我消息的大小?

c++ - Winsock2 C++ : How do I find the address for an IPv4 client to send a packet to an IPv6 server?

c++ - 为什么在调用这个列表时需要 "&"?

C++ 程序错误 - 虚拟析构函数

c++ - Boost regex_replace 异常 : "...This exception is thrown to prevent "eternal"matches. .."偶尔抛出