boost::asio设置同步连接超时
2014-06-13 14:45
495 查看
boost::asio设置同步连接超时
CSDN上求助无果,只好用自创的非主流方法了。 asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写一个回调函数,不利于把连接和超时封装到单个函数里。传统的Winsock编程可以先把socket设为非阻塞,然后connect,再用select来判断超时,asio也可以这样做,唯一“非主流”的是asio里没有一个类似select的函数,所以得调用原始的Winsock API,也就牺牲了跨平台: #include <iostream> #include <boost/asio.hpp> int main() { boost::asio::io_service ios; boost::asio::ip::tcp::socket s(ios); boost::system::error_code ec; s.open(boost::asio::ip::tcp::v4()); // 设为非阻塞 s.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true)); // connect时必须指定error_code参数,否则会有异常抛出 s.connect( boost::asio::ip::tcp::endpoint( boost::asio::ip::address::from_string("192.168.1.1"), 80) , ec); fd_set fdWrite; FD_ZERO(&fdWrite); FD_SET(s.native(), &fdWrite); timeval tv = {5}; // 5秒超时 if (select(0, NULL, &fdWrite, NULL, &tv) <= 0 || !FD_ISSET(s.native(), &fdWrite)) { std::cout << "超时/出错啦" << std::endl; s.close(); return 0; } // 设回阻塞 s.io_control(boost::asio::ip::tcp::socket::non_blocking_io(false)); std::cout << "连接成功" << std::endl; s.close(); return 0; } |
相关文章推荐
- boost::asio设置同步连接超时
- boost::asio::io_service 超时设置
- Socket中如何设置连接超时(转载 可能用的到)
- Socket中如何设置连接超时
- Socket中如何设置连接超时
- Socket中如何设置连接超时
- 基于Boost.asio的简单一对一同步聊天程序
- Socket中如何设置连接超时
- Socket中如何设置连接超时
- 路由器/交换机 设置光标跟随及连接超时
- Socket中如何设置连接超时(转)
- CSocket同步操作阻塞时设置超时的解决方案 推荐
- Socket中如何设置连接超时(转)
- SQL 视图效率和连接超时设置
- 同步复制数据库,当网络问题,服务器间断开连接,复制中断后,自动继续复制的设置
- python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
- Socket中如何设置连接超时
- Socket中如何设置连接超时
- 如何在Http连接中设置超时?
- XFire平台下的连接超时设置