Example 7a
client--同步connect
#include <iostream>
#include <asio.hpp>
#include <thread>
#include <vector>
#include<mutex>
#include <functional>
#include <chrono>
std::mutex global_lock;
void workerThread(std::shared_ptr<asio::io_service> io_service ){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" start"<<std::endl;
global_lock.unlock();
try{
asio::error_code ec;
io_service->run(ec);
if(ec){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Error: "<<ec<<std::endl;
global_lock.unlock();
}
}
catch(std::exception &ex){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Exception: "<<ex.what()<<std::endl;
global_lock.unlock();
}
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" end"<<std::endl;
global_lock.unlock();
}
using asio::ip::tcp ;
int main(int argc,char * argv[]){
std::shared_ptr<asio::io_service> io_service(
new asio::io_service);
std::shared_ptr<asio::io_service::work> work(
new asio::io_service::work(*io_service));
std::shared_ptr<asio::io_service::strand> strand=std::make_shared<asio::io_service::strand>(*io_service);
std::cout<<"Press Enter to exit"<<std::endl;
std::vector<std::thread> ntid;
for(int i=0;i<4;i++)
{
ntid.push_back(std::thread(workerThread,io_service));
}
tcp::socket socket(*io_service);
try{
tcp::resolver resolver(*io_service);
tcp::resolver::query query("www.baidu.com","80");
tcp::resolver::iterator iter=resolver.resolve(query);
tcp::endpoint endpoint=*iter;;
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Connecting to :"<<endpoint<<std::endl;
global_lock.unlock();
socket.connect(endpoint);
}
catch(std::exception &e){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" "<<e.what()<<std::endl;
global_lock.unlock();
}
std::cin.get();
asio::error_code ec;
socket.shutdown(tcp::socket::shutdown_both,ec);
socket.close(ec);
io_service->stop();
for(auto &iter:ntid){
iter.join();
}
return 0;
}
image.png
Example 7b
client--异步
#include <iostream>
#include <asio.hpp>
#include <thread>
#include <vector>
#include<mutex>
#include <functional>
#include <chrono>
std::mutex global_lock;
void workerThread(std::shared_ptr<asio::io_service> io_service ){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" start"<<std::endl;
global_lock.unlock();
try{
asio::error_code ec;
io_service->run(ec);
if(ec){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Error: "<<ec<<std::endl;
global_lock.unlock();
}
}
catch(std::exception &ex){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Exception: "<<ex.what()<<std::endl;
global_lock.unlock();
}
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" end"<<std::endl;
global_lock.unlock();
}
using asio::ip::tcp ;
void OnConnect(const asio::error_code &ec,std::shared_ptr<tcp::socket>socket){
if(ec){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Error "<<ec<<std::endl;
global_lock.unlock();
}else{
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" connected!"<<std::endl;
global_lock.unlock();
}
}
int main(int argc,char * argv[]){
std::shared_ptr<asio::io_service> io_service(
new asio::io_service);
std::shared_ptr<asio::io_service::work> work(
new asio::io_service::work(*io_service));
std::shared_ptr<asio::io_service::strand> strand=std::make_shared<asio::io_service::strand>(*io_service);
std::cout<<"Press Enter to exit"<<std::endl;
std::vector<std::thread> ntid;
for(int i=0;i<4;i++)
{
ntid.push_back(std::thread(workerThread,io_service));
}
std::shared_ptr<tcp::socket> socket=std::make_shared<tcp::socket>(*io_service);
try{
tcp::resolver resolver(*io_service);
tcp::resolver::query query("www.baidu.com","80");
tcp::resolver::iterator iter=resolver.resolve(query);
tcp::endpoint endpoint=*iter;;
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Connecting to :"<<endpoint<<std::endl;
global_lock.unlock();
socket->async_connect(endpoint,std::bind(OnConnect,std::placeholders::_1,socket));
}
catch(std::exception &e){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" "<<e.what()<<std::endl;
global_lock.unlock();
}
std::cin.get();
asio::error_code ec;
socket->shutdown(tcp::socket::shutdown_both,ec);
socket->close(ec);
io_service->stop();
for(auto &iter:ntid){
iter.join();
}
return 0;
}
image.png
Example 7c
服务端:注意,以下程序只能接受一次连接。
#include <iostream>
#include <asio.hpp>
#include <thread>
#include <vector>
#include<mutex>
#include <functional>
#include <chrono>
std::mutex global_lock;
void workerThread(std::shared_ptr<asio::io_service> io_service ){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" start"<<std::endl;
global_lock.unlock();
try{
asio::error_code ec;
io_service->run(ec);
if(ec){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Error: "<<ec<<std::endl;
global_lock.unlock();
}
}
catch(std::exception &ex){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Exception: "<<ex.what()<<std::endl;
global_lock.unlock();
}
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" end"<<std::endl;
global_lock.unlock();
}
using asio::ip::tcp ;
void OnAccept(const asio::error_code &ec,std::shared_ptr<tcp::socket>socket){
if(ec){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Error "<<ec<<std::endl;
global_lock.unlock();
}else{
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Accepted! "<<std::endl;
global_lock.unlock();
}
}
int main(int argc,char * argv[]){
std::shared_ptr<asio::io_service> io_service(
new asio::io_service);
std::shared_ptr<asio::io_service::work> work(
new asio::io_service::work(*io_service));
std::shared_ptr<asio::io_service::strand> strand=std::make_shared<asio::io_service::strand>(*io_service);
std::cout<<"Press Enter to exit"<<std::endl;
std::vector<std::thread> ntid;
for(int i=0;i<4;i++)
{
ntid.push_back(std::thread(workerThread,io_service));
}
std::shared_ptr<tcp::acceptor> acceptor=std::make_shared<tcp::acceptor>(*io_service);
std::shared_ptr<tcp::socket> socket=std::make_shared<tcp::socket>(*io_service);
try{
tcp::resolver resolver(*io_service);
tcp::resolver::query query("127.0.0.1","8081");
tcp::resolver::iterator iter=resolver.resolve(query);
tcp::endpoint endpoint=*iter;;
acceptor->open(endpoint.protocol());
acceptor->set_option(tcp::acceptor::reuse_address(false));
acceptor->bind(endpoint);
acceptor->listen(asio::socket_base::max_connections);
acceptor->async_accept(*socket,std::bind(OnAccept,std::placeholders::_1,socket));
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" Listening on :"<<endpoint<<std::endl;
global_lock.unlock();
}
catch(std::exception &e){
global_lock.lock();
std::cout<<std::this_thread::get_id()<<" "<<e.what()<<std::endl;
global_lock.unlock();
}
std::cin.get();
asio::error_code ec;
socket->shutdown(tcp::socket::shutdown_both,ec);
socket->close(ec);
io_service->stop();
for(auto &iter:ntid){
iter.join();
}
return 0;
}
image.png
image.png