zoukankan      html  css  js  c++  java
  • 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
    
    	//无止境的时间...
    	//断点中止后...可以看到,会将服务器发的数据一起收到,
    	//而且没有做同步的效果..收到一半的数据...
    }
    
  • 相关阅读:
    DOM 与BOM
    尝试json文件导入数据
    js事件监听简介
    js事件简介
    js中的for语句简介
    作业练习正则表达式
    简单总结-BOM
    web前端第三次作业em,fr,rem,px简单解释及颜色表
    web第二次作业练习grid
    web前端课程第一次作业----注册页面代码(2018-9-14)
  • 原文地址:https://www.cnblogs.com/ezhong/p/2861019.html
Copyright © 2011-2022 走看看