boost::asio設置同步連接超時
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
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;
- }