//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
//无止境的时间...
//断点中止后...可以看到,会将服务器发的数据一起收到,
//而且没有做同步的效果..收到一半的数据...
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ezhong的博客签名-------------------------------------
以上内容来自ezhong的博客园,作者:ezhong
ezhong的博客园: http://www.cnblogs.com/ezhong
感谢您的阅读。感谢您的分享。
浙公网安备 33010602011771号