asio庫介紹
ASIO庫能夠使用TCP、UDP、ICMP、序列槽來發送/接收資料,下面先介紹TCP協定的讀寫操作。對于讀寫方式,ASIO支援同步和異步兩種方式。是基于proactor的。
io_service
程式至少需要一個 io_service 執行個體。Boost.Asio 使用 io_service 同作業系統的輸入/輸出服務進行互動。通常一個 io_service 的執行個體就足夠了。
boost::asio::io_service io;
asio庫的定時器寫法
阻塞式
boost::asio::io_service io;//這個是boost必須要有的,是下面的定義綁定再誰身上
//定義5秒鐘,這個時間類和chnoro有點像,不過這個更多于時間區之類的
boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
t.wait();//上面的那個io,其實有兩種方式,一種阻塞式,一種非阻塞式
//這種寫法就是阻塞式
std::cout<<"到我這裡了"<<std::endl;
非阻塞式
voidcallback(constboost::system::error_code& )
{
std::cout<< "hello" << std::endl;
}
int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io,
boost::posix_time::seconds(5));
t.async_wait(callback);//這段代碼相當于是注冊,把這個函數指針代入,5秒後傳回
std::cout<< "開始執行io.run\n";
io.run();//這個相當于是死循環,隻有兩種情況才會退出,一種是調用stop函數,一種是事件池空了
//可見,這個callback是在run裡面執行的
std::cout<< "結束執行io.run";
return 0;
}
定時器其實這個在網絡程式設計也經常會用到。比如心跳包之類的。
socket TCP連接配接寫法(同步)
伺服器
int main()
{
using namespace boost::asio;//太長寫個這個,真正程式設計最好少有
io_service iosev;//這是必須要有的
ip::tcp::acceptor acceptor(iosev,ip::tcp::endpoint(ip::tcp::v4(), 1000));
//這個可以了解為基于ip、tcp的伺服器接收器,第一個參數就是需要通過這個接口和作業系統打交道
//第二個參數就是基于ip、tcp的端點,這個端點端口号是1000,屬于ipv4,本機ip。
for(;;)//死循環可以一直接收下一個使用者的連進
{
// 定義一個socket對象,就是把連接配接操作當做對象的操作。
ip::tcp::socket socket(iosev);
// 等待直到用戶端連接配接進來
acceptor.accept(socket);
// 顯示連接配接進來的用戶端的位址和端口
std::cout << socket.remote_endpoint().address() << std::endl;
std::cout << socket.remote_endpoint().port() << endl;
// 向用戶端發送資料
boost::system::error_code ec;
socket.write_some(buffer("welcone to asio server"), ec);
if (ec)//如果是錯誤代碼就輸出
{
std::cout <<boost::system::system_error(ec).what() << std::endl;
break;
}
// 與目前客戶互動完成後循環繼續等待下一客戶連接配接
}
return 0;
}
用戶端
using namespace boost::asio;
io_service iosev;
ip::tcp::socket socket(iosev);
ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
//本機測試使用回路位址
boost::system::error_code ec;
socket.connect(ep, ec);
// 如果出錯,列印出錯資訊
if (ec)
{
std::cout << boost::system::system_error(ec).what() << std::endl;
return -1;
}
// 接收資料
char buf[100];
size_t len = socket.read_some(buffer(buf), ec);
std::cout.write(buf, len);
總結:
1、給我的感覺就是用了類來封裝socket的函數,但是添加了很多的功能,這樣的寫法比傳統的抽象。
2、socket是伺服器與用戶端通信的橋梁,io_service是使用者和作業系統互動橋梁。
3、ASIO的TCP協定通過boost::asio::ip名空間下的tcp類進行通信。