可以先了解一下Boost asio基本概念,以下是Boost asio實現的同步TCP/IP通信:
服務器程序部分,如果想保留套接字之後繼續通信,可以動態申請socket_type,保存指針,因為socket_type貌似不能拷貝:
#include "stdafx.h" #include <iostream> #include <boost/asio.hpp> using namespace boost::asio; using namespace std; int main() { try { typedef ip::tcp::acceptor acceptor_type; typedef ip::tcp::endpoint endpoint_type; typedef ip::tcp::socket socket_type; std::cout<<"Server start."<<endl; io_service io; acceptor_type acceptor(io, endpoint_type(ip::tcp::v4(), 6688)); std::cout<<acceptor.local_endpoint().address()<<endl; for (;;) { socket_type sock(io); acceptor.accept(sock); std::cout<<"Client"; std::cout<<sock.remote_endpoint().address()<<endl; sock.send(buffer("Hello asio")); } } catch (std::exception &e) { std::cout<<e.what()<<endl; } return 0; }
客戶端:
#include "stdafx.h" #include <iostream> #include <boost/asio.hpp> using namespace boost::asio; using namespace std; int main() { try { typedef ip::tcp::acceptor acceptor_type; typedef ip::tcp::endpoint endpoint_type; typedef ip::tcp::socket socket_type; typedef ip::address address_type; std::cout<<"Client start."<<endl; io_service io; socket_type sock(io); endpoint_type ep(address_type::from_string("127.0.0.1"), 6688); sock.connect(ep); vector<char> str(100, 0); boost::system::error_code ec; for (;;)//循環接收 { sock.read_some(buffer(str), ec); if (ec) { break; } cout<<&str[0]; } // 析構自動斷開連接 } catch (std::exception &e) { std::cout<<e.what()<<endl; } return 0; }