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