boost的網路程式庫asio

來源:互聯網
上載者:User

boost在1.35版本之後終於加入了網路程式庫asio。春節期間終於得閑能夠一窺究竟,同時將boost.asio和知名的ACE架構做一下比較。

 

asio的名字突出了非同步I/O的能力,從asio的文檔中看到它使用了和ACE Proactor架構中相似的Proactor模式。CSDN上也有很多網友也寫了很多關於非同步I/O的好文章,但是我還是決定從同步I/O開始。儘管阻塞I/O不是那麼酷那麼絢麗但是在網路編程中它和非同步I/O一樣重要。

 

下面是一個簡單的同步I/O的例子,使用的是鎖步(lock-step)方式的通訊。

 

 

#include <string><br />#include "boost/asio.hpp"<br />#include "boost/lexical_cast.hpp"</p><p>using namespace std;<br />using namespace boost;<br />using boost::asio::ip::tcp;<br />using boost::asio::io_service;</p><p>class Client<br />{<br />public:<br />Client (const string & hostname, unsigned short port);<br />virtual ~Client ();</p><p>// methods<br />virtual void send (const string & message);<br />virtual string recv ();<br />virtual void close ();</p><p>private:<br />io_service * io_service_;<br />tcp::socket * socket_;<br />};</p><p>Client::Client (const string & hostname, unsigned short port)<br />{<br />io_service_ = new io_service();<br />socket_ = new tcp::socket(*io_service_);</p><p>tcp::resolver resolver(*io_service_);<br />tcp::resolver::query query(hostname, boost::lexical_cast<string, unsigned short>(port));</p><p>boost::system::error_code ec;<br />tcp::resolver::iterator iter = resolver.resolve(query, ec);<br />tcp::resolver::iterator end;</p><p>// pick the first endpoint<br />if (iter != end && ec == 0)<br />{<br />tcp::endpoint endpoint = *iter;<br />std::cout << "Connecting to: " << endpoint << std::endl;</p><p>socket_->connect(endpoint, ec);<br />if (ec)<br />{<br />std::cerr << "Error: " << ec << std::endl;<br />throw ec;<br />}<br />}<br />}</p><p>Client::~Client ()<br />{<br />delete socket_;<br />delete io_service_;<br />}</p><p>void Client::send (const string & message)<br />{<br />boost::asio::const_buffers_1 request(message.data(), message.size());<br />socket_->send(request);<br />}</p><p>string Client::recv ()<br />{<br />char response[128];<br />size_t num = socket_->receive(boost::asio::buffer(response));<br />if (num > 0)<br />{<br />return string (response, num);<br />}</p><p>return "";<br />}</p><p>void Client::close ()<br />{<br />socket_->close();</p><p>}</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />Client client ("localhost", 2009);<br />std::cout << client.recv() << endl;</p><p>string request;</p><p>do<br />{<br />std::cout << "Request: ";</p><p>std::cin >> request;</p><p>if (request == "q")<br />break;</p><p>client.send (request);</p><p>std::cout << "Response: " << client.recv() << endl;<br />}<br />while (true);</p><p>client.close();<br />return 0;<br />}<br />  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.