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

	//无止境的时间...
	//断点中止后...可以看到,会将服务器发的数据一起收到,
	//而且没有做同步的效果..收到一半的数据...
}
原文地址:https://www.cnblogs.com/ezhong/p/2861019.html