Windows上的Boost asio套接字无法异步连接

Posted

技术标签:

【中文标题】Windows上的Boost asio套接字无法异步连接【英文标题】:Boost asio socket on windows can't async_connect 【发布时间】:2014-12-02 17:54:29 【问题描述】:

调用async_connect时出错,是

uncaught exception of type N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_6system12system_errorEEEEE
- socket_select_interrupter: The attempted operation is not supported for the type of object referenced

拆解:

uncaught exception of type boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > - socket_select_interrupter: The attempted operation is not supported for the type of object referenced

以下是一些相关代码:

typedef boost::shared_ptr<boost::asio::ip::tcp::socket> tTCPSocketPtr;

boost::shared_ptr<boost::asio::io_service> ioservice =  boost::shared_ptr<boost::asio::io_service> (new boost::asio::io_service());

socketPtr = tTCPSocketPtr(new boost::asio::ip::tcp::socket(*ioService));

boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string(this->ipAddress),  this->port);


// Set a deadline for the connect operation.
deadline->expires_from_now(boost::posix_time::seconds(5));

socketPtr->async_connect(endpoint,
        boost::bind(&AConnection::handle_connect,
        shared_from_this(), _1, endpoint)); //errors out here

我用谷歌搜索并没有发现任何有用的东西。

我该如何解决这个错误? 谢谢你, 某人

【问题讨论】:

它不会在// errors out here 出错,原因很简单,异步操作不会内联执行。因此,您可能的意思是,如果您在此之前停止(或将其注释掉),您不会收到相同的错误? 【参考方案1】:

您显示的代码不够多。

不过,使用我的水晶球,我猜你得到的是 Win32 错误代码,这可能意味着你使用了无效的句柄。

看到您使用enable_shared_from_this,我猜想这会导致您的问题(尽管代码中未显示)。

我的最佳猜测是您可能在构造函数内部使用shared_from_this(这会导致错误)。

【讨论】:

谢谢你。对 async_connect 的调用不在构造函数中。感谢您的意见。【参考方案2】:

在 Windows 上,异步连接最终会调用 ConnectEx(),这在 Windows Vista 之前的操作系统上不受支持。

所以,恕我直言,最重要的问题是您尝试在什么操作系统上运行代码?

鉴于您在 ConnectEx 支持的操作系统上运行,下一个检查是您没有安装任何可能阻止使用 ConnectEx 的 LSP。 (可能最简单的检查方法是在相关操作系统的全新安装 VM 上运行代码)...

【讨论】:

感谢 Len,我正在研究您的 VM 全新安装想法

以上是关于Windows上的Boost asio套接字无法异步连接的主要内容,如果未能解决你的问题,请参考以下文章

boost.asio 和文件 i/o 有啥关系?

Boost Android Asio 连接错误

在 Boost.Asio 中同时使用 SSL 套接字和非 SSL 套接字?

可以在没有 boost 或 C++11 的情况下使用 Asio 吗?

我们可以用 boost.asio 创建未命名的套接字来模拟匿名管道吗?

C++ Boost.Asio - tcp 套接字异步写入