ASIO學習二:socket


//boost :boost_1_51
//		1_44沒有boost::asio::connect函數..與官網的向導不符...
//		(其實不是不符..代碼與文檔要匹配,看清穩定版還是最新版)
//		可以用socket.connect...
//
//CONTENT
//Introduction to Sockets
//內容引用URL :http://think-async.com/Asio/boost_asio_1_5_3/doc/html/boost_asio/tutorial.html

//first class :daytime protocol TCP

//synchronous TCP Daytime client
//date: 2012-12-24
#include "iostream"
#include "boost/array.hpp"
#include "boost/asio.hpp"
using boost::asio::ip::tcp;
void daytime_client()
{
	
	try{
		//所有使用ASIO的程序最少有一個io_service對象
		boost::asio::io_service io_service;

		//將服務器名字轉換為TCP endpoint
		tcp::resolver resolver(io_service);

		std::string host ="192.168.3.144" ;//specify the host
		//resolver需要一個query對象,並將query轉換為a list of endpoints
		//host name,也就是IP地址
		//the name of service,也就是端口...
		tcp::resolver::query query(tcp::v4(),host,"13");
		//	tcp::resolver::query query(tcp::v4(),argv[1], "13");

		//ip::tcp::resolver::iterator來保存list of endpoints
		tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

	
		//創建socket
		tcp::socket socket(io_service);

		//list of endpoints 可能包含IPV4 /IPV6 endpoint,
		//需要一個個測試找到可以用的,可以使程序兼容IP的版本
		//這些工作由boost::asio::connect自動完成。
		//連接socket

		//如果是boost1_44:error C2039: 'connect' : is not a member of 'boost::asio'
		boost::asio::connect(socket, endpoint_iterator);

		//read the response from the daytime service

		for(;;)
		{
			boost::array<char,128>buf;
			boost::system::error_code error;
			//boost::asio::buffer確定緩沖大小並防止越界.
			size_t len = socket.read_some(boost::asio::buffer(buf),error);

			//當Server關閉連接的時候,read_some返回boost::asio::error::eof
			if(error == boost::asio::error::eof)
				break;
			else if(error)
				throw boost::system::system_error(error);

			std::cout.write(buf.data(),len);
		}
	}
	catch(std::exception &e)
	{
		std::cerr <<e.what() <<std::endl;
	}

}

//CONTENT

//內容引用URL :http://think-async.com/Asio/boost_asio_1_5_3/doc/html/boost_asio/tutorial/tutdaytime2.html

//A synchronous TCP Daytime server
//date: 2012-12-26
#include<ctime>
#include<iostream>
#include<string>
#include<boost/asio.hpp>
using boost::asio::ip::tcp;

std::string make_daytime_string(){
	
	using namespace std; //for time_t ,time ,ctime
	time_t now = time(0);

	return ctime(&now);
}
void daytime_server(){
	
	try{
		boost::asio::io_service io_service;

		//創建一個ip::tcp::acceptor用來監聽連接.
		//初始化為監聽TCP port 13, IPV4
		tcp::acceptor acceptor(io_service,tcp::endpoint(tcp::v4(),13));

		//情況2:創建一個連接,循環發送數據...
		tcp::socket socket(io_service);
		acceptor.accept(socket);
		for(;;)
		{
			//情況1:創建一個代表連接的socket,等待連接...只發送一次數據后析構..
			//tcp::socket socket(io_service);
			//acceptor.accept(socket);

			//傳送當前時間...
			std::string message = make_daytime_string();
			boost::system::error_code ignored_error;
			boost::asio::write(socket,boost::asio::buffer(message),ignored_error);

		}
	}
	catch(std::exception &e)
	{
		std::cerr<<e.what()<<std::endl;
	}
	return ;
}

//
#include "boost/thread/thread.hpp"
void class6(){

	boost::thread t(daytime_server);
	daytime_client();

//1.
	//ser中:代表連接的socket(for循環中的tcp::socket socket)
	//		作為局部變量當再次循環時會析構,導致連接斷開
	//		client:中讀到boost::asio::error::eof,
	
	//client退出,daytime_client()返回,
	//線程t析構,函數結束...



	//程序輸出:
	//input your choice
	//6
	//Thu Dec 27 13:07:43 2012
	//input your choice

//2.
	//如果ser中代表連接的tcp::socket在for外部

		//input your choice
		//6
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 27 13:21:32 2012
		//Thu Dec 2

	//無止境的時間...
	//斷點中止后...可以看到,會將服務器發的數據一起收到,
	//而且沒有做同步的效果..收到一半的數據...
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM