徐々にBoost.Asioも触っていこうと思います。
async_connectを使用すると、非同期に接続処理が行われ、接続完了もしくは失敗時にハンドラが呼ばれます。
デフォルトではerror_codeのみがハンドラに渡されますが、boost::bindを併用してソケットや他の情報を持ちまわることもできます。
#include <iostream> #include <boost/asio.hpp> namespace asio = boost::asio; namespace ip = boost::asio::ip; void connect_handle(const boost::system::error_code& error) { if (error) std::cout << error << std::endl; else std::cout << "success" << std::endl; } int main() { asio::io_service ios; ip::tcp::socket soc(ios); soc.async_connect(ip::tcp::endpoint(ip::address::from_string("127.0.0.1"), 31400), connect_handle); ios.run(); for (;;) {} }
success
以下サーバー側のコード。
単にacceptして切断してるだけです。
#include <iostream> #include <boost/asio.hpp> using namespace std; using namespace boost::asio; using ip::tcp; int main() { io_service io; tcp::acceptor acc(io, tcp::endpoint(tcp::v4(), 31400)); for (;;) { tcp::iostream s; acc.accept(*s.rdbuf()); cout << "[connect start]" << endl; cout << "[connect end]" << endl; } }