Boost.asio实现同步的TCP/IP通信

同步阻塞模式下的TCP/IP通信

io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。

    asio::io_service io_service;
    asio::ip::tcp::socket socket(io_service);

在asio框架中,同步的io主要流程如下:

    Boost.asio实现同步的TCP/IP通信_第1张图片

  1. 应用程序调用IO对象成员函数执行IO操作
  2. IO对象向io_service 提出请求.
  3. io_service 调用操作系统的功能执行连接操作.
  4. 操作系统向io_service 返回执行结果.
  5. io_service将错误的操作结果翻译为boost::system::error_code类型,再传递给IO对象.
  6. 如果操作失败,IO对象抛出boost::system::system_error类型的异常.
#include         
#include     
using namespace std;  


#include     
#include     
#include     
#include     
using namespace boost;    


typedef boost::mutex CMutex;    
CMutex muConsole;//互斥访问控制台  

typedef boost::asio::io_service IoService;    
typedef boost::asio::ip::tcp TCP;    

//Asio同步socket连接示例   

//全局变量,主线程退出的标志  
bool bContinue = true;  

//可变参数列表函数  
void ConsoleOutput(bool bClient, char* lpszFmt, ...){  
	//主线程输出:FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE  
	//客户端线程输出:FOREGROUND_RED  
	//服务器线程输出:FOREGROUND_GREEN  
	va_list pArgLst;    

	va_start(pArgLst, lpszFmt);    
	muConsole.lock();    
	if(bClient)     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);        
	else                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);  
	vfprintf(stdout, lpszFmt, pArgLst);    
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);     
	muConsole.unlock();    
	va_end(pArgLst);    
}  

void ClientProc(){  
	char szRecvBuff[64];  
	for(int i = 0; i < 3; i++){  
		this_thread::sleep(posix_time::seconds(1));//让出CPU1S  
		try{  
			//创建套接字  
			IoService oIoSrv;  
			TCP::socket oSock(oIoSrv);  
			//连接服务器  
			TCP::endpoint oEndPt(asio::ip::address::from_string("127.0.0.1"), 5432);//Bind IP&Port  
			oSock.connect(oEndPt);  
			//接收来自服务器的消息  
			memset(szRecvBuff, 0, sizeof(char)*64);  
			oSock.read_some(asio::buffer(szRecvBuff));  

			ConsoleOutput(true, "This is client, recved msg : %s\n", szRecvBuff);  
		}  
		catch(std::exception& e){  
			cout << e.what() << endl;  
		}  
	}  
	ConsoleOutput(true, "ClientThreadExists\n");  
	bContinue = false;  
}  
void ServerProc(){  
	try{  
		IoService oIoSrv;  
		TCP::acceptor oAcceptor(oIoSrv, TCP::endpoint(TCP::v4(), 5432));  
		ConsoleOutput(false, "LocalServer : %s\n", (oAcceptor.local_endpoint().address()).to_string().c_str());  
		while(bContinue){  
			//阻塞等待客户端的连接  
			TCP::socket oSock(oIoSrv);  
			oAcceptor.accept(oSock);  
			//连接成功,向客户端发送消息  
			ConsoleOutput(false, "RemoteClient : %s\n", oSock.remote_endpoint().address().to_string().c_str());  
			oSock.write_some(asio::buffer("Hello, Client"));  
			//此处的等待是为了在客户端退出后  
			//陷入等待的阻塞之前检测到退出标志  
			this_thread::sleep(posix_time::seconds(2));  
		}  
	}  
	catch(std::exception& e){  
		cout << e.what() << endl;  
	}  
	ConsoleOutput(false, "ServerThreadExists\n");  
}  


void main()  
{  
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);     

	thread oServerThread(&ServerProc);//启动服务器线程  
	thread oClientThread(&ClientProc);//启动客户端线程  

	//等待客户端线程结束  
	muConsole.lock();    
	cout << "WaitFor Client..." << endl;  
	muConsole.unlock();    
	oClientThread.join();  

	//等待服务器线程结束  
	muConsole.lock();    
	cout <<  "WaitFor Server..." << endl;  
	muConsole.unlock();    
	oServerThread.join();  
}  

运行结果:

Boost.asio实现同步的TCP/IP通信_第2张图片

你可能感兴趣的:(Boost(开放的源码,强大的工具))