【问题标题】:Why does tcp::socket::is_open() method return true when connecting a non-existent address?为什么连接不存在的地址时 tcp::socket::is_open() 方法返回 true?
【发布时间】:2019-05-27 07:28:35
【问题描述】:

我使用 tcp::socket::connect 方法连接了一个不存在的地址,它按预期返回了 WSAETIMEDOUT(10060)。但是为什么调用 tcp::socket::is_open() 返回 1(true) ?我认为它应该返回 0(false),因为建立连接失败。

int main(int argc, char* argv[]) {
    boost::asio::io_context context;
    tcp::socket socket(context);
    /*non-existent address 111.111.111.111:8080*/
    tcp::endpoint endpoint(address::from_string("111.111.111.111"), 8080);
    error_code result_error;
    socket.connect(endpoint, result_error);

    /* error code: WSAETIMEDOUT [10060]
    *  description: established connection failed because connected host has failed to respond
    */
    std::cout << "error code: " << result_error.value()<< result_error.message() << std::endl;

    /*returned 1*/
    std::cout << "is_open returned: "<< socket.is_open() << std::endl;
}

我希望 is_open 的输出为 0,但实际输出为 1。

【问题讨论】:

标签: c++ boost-asio


【解决方案1】:

is_open 函数只检查套接字是否“打开”(open 函数已成功调用),而不是套接字是否已连接。

简而言之,is_open 检查的是套接字创建状态,而不是套接字连接状态。

如果您看到this old SO answer,它会告诉您无法知道连接状态,并提供解决方法(自己保持连接状态)。

【讨论】:

  • connect 中检查error_code 也是谨慎的做法。
  • 谢谢,目前,每次调用connect/read/write方法出错时我都会关闭socket,这使得is_open等于is_connected
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2013-01-23
  • 2019-06-29
  • 2012-01-28
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多