gpt4 book ai didi

c++ - 远程端点 : Transport endpoint is not connected

转载 作者:IT王子 更新时间:2023-10-29 00:49:38 25 4
gpt4 key购买 nike

异常从 Linux 上的 io_service:run 发出。

事情是这样的。我使用 Boost.Asio 实现了简单的异步回显服务器。它是单线程的,一切都是异步的,也就是说我只使用异步版本的接受、发送和接收函数。当客户端没有正常断开连接(例如它崩溃)时,服务器的事件循环会抛出 boost::system::system_error 异常remote_endpoint: Transport endpoint is not connected。为什么会发生,如何处理?是不是SIGPIPE信号引起的?如果是这样,保持服务器运行的最佳方法是什么?处理异常还是处理信号?

最佳答案

异常表示basic_stream_socket::remote_endpoint()的抛出版本被调用,在对 getpeername() 的底层调用中返回错误 ENOTCONN。根据 effect of exceptions thrown from handlers文档,允许在处理程序中抛出的异常通过抛出线程调用 run()run_one()poll() 向上传播, 或 poll_one()

要解决此问题,请考虑:

  • 调用 basic_stream_socket::remote_endpoint() 的非抛出版本,并适本地处理错误:

    boost::system::error_code ec;
    boost::asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
    if (ec)
    {
    // An error occurred. Stop the asynchronous call chain for
    // this connection.
    }
  • try/catch block 中调用 run()。文档中提到了以下代码:

    boost::asio::io_service io_service;
    ...
    for (;;)
    {
    try
    {
    io_service.run();
    break; // run() exited normally
    }
    catch (my_exception& e)
    {
    // Deal with exception as appropriate.
    }
    }

    使用这种方法,线程可能会重新调用 run()无需调用 reset()io_service 上。

关于c++ - 远程端点 : Transport endpoint is not connected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22425582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com