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