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 中同时使用 SSL 套接字和非 SSL 套接字?
可以在没有 boost 或 C++11 的情况下使用 Asio 吗?