c++ - 为什么连接不存在的地址时 tcp::socket::is_open() 方法返回 true?
问题描述
我使用 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。
解决方案
该is_open
函数仅检查套接字是否“打开”(该open
函数已成功调用),而不是套接字是否已连接。
简而言之,is_open
检查套接字创建状态,而不是套接字连接状态。
如果您看到这个旧的 SO 答案,它会告诉您不可能知道连接状态,并提供解决方法(自己保持连接状态)。
推荐阅读
- javascript - CSS 过渡在 Firefox 上随机“缩放”某些元素
- javascript - 随机报价生成器多个报价
- mmenu - 从语言选项卡返回菜单选项卡时还记得选择的面板吗?
- html - 在 CKAN 的 Jinja2 模板中插入静态 html
- c++ - 如何将 C++ 代码构建到 .so 和 .dll 中
- python - 如何让对象在pygame中以随机模式移动?
- java - 如何在 Java 中对方法列表进行排序?
- swift - 当本地化键不存在时返回静态默认值
- java - Android Studio 无法解析符号文本变红
- powershell - Powershell匹配当前行和下一行然后输出文件