c++ boost asio库初学习

前些日子研究了一个c++的一个socket库,留下范例代码给以后自己参考。

 

同步server:

 1 // asio_server.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "boost/asio.hpp"
 6 #include "boost/bind.hpp"
 7 
 8 using namespace boost::asio;
 9 
10 io_service service;
11 size_t read_complete(char * buff, const boost::system::error_code & err, size_t bytes) {
12     if (err) return 0;
13     bool found = std::find(buff, buff + bytes, '\n') < buff + bytes;
14     // 我们一个一个读取直到读到回车,不缓存
15     return found ? 0 : 1;
16 }
17 void handle_connections() {
18     ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(), 8001));
19     char buff[1024];
20     while (true) {
21         ip::tcp::socket sock(service);
22         acceptor.accept(sock);
23         int bytes = read(sock, buffer(buff), boost::bind(read_complete, buff, _1, _2));
24         std::string msg(buff, bytes);
25         sock.write_some(buffer(msg));
26         sock.close();
27     }
28 }
29 int _tmain(int argc, char* argv[]) {
30     handle_connections();
31 }

 

同步client:

 1 // boost_aiso_test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
 2 //
 3 
 4 #include "stdafx.h"
 5 
 6 #include <iostream>
 7 #include <boost/asio.hpp>
 8 #include <boost/bind.hpp>
 9 #include <boost/shared_ptr.hpp>
10 #include <boost/enable_shared_from_this.hpp>
11 #include <boost/thread.hpp>
12 
13 using namespace boost::asio;
14 
15 
16 io_service service;
17 ip::address_v4 add;
18 ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 8001);
19 
20 size_t read_complete(char * buf, const boost::system::error_code & err, size_t bytes)
21 {
22     if (err) return 0;
23     bool found = std::find(buf, buf + bytes, '\n') < buf + bytes;
24     // 我们一个一个读取直到读到回车,不缓存
25     return found ? 0 : 1;
26 }
27 void sync_echo(std::string msg) {
28     msg += "\n";
29     ip::tcp::socket sock(service);
30     sock.connect(ep);
31     sock.write_some(buffer(msg));
32     char buf[1024];
33     int bytes = read(sock, buffer(buf), boost::bind(read_complete, buf, _1, _2));
34     std::string copy(buf, bytes - 1);
35     msg = msg.substr(0, msg.size() - 1);
36     std::cout << "server echoed our " << msg << ": " << (copy == msg ? "OK" : "FAIL") << std::endl;
37     sock.close();
38 }
39 int _tmain(int argc, char* argv[]) {
40     char* messages[] = { "John says hi", "so does James", "Lucy just got home", "Boost.Asio is Fun!", 0 };
41     boost::thread_group threads;
42     for (char ** message = messages; *message; ++message) {
43         threads.create_thread(boost::bind(sync_echo, *message));
44         boost::this_thread::sleep(boost::posix_time::millisec(100));
45     }
46     threads.join_all();
47 }

 

 

-------------------------------------------------------- 异步是参考其他博客 --------------------------------------------------------

异步server:

 1 #include "stdafx.h"
 2 
 3 #include <boost/asio.hpp>
 4 #include <iostream>
 5 using namespace boost::asio;
 6 class Server
 7 {
 8     typedef ip::tcp::socket socket_type;
 9     typedef std::shared_ptr<socket_type> sock_ptr;
10 public:
11     Server() :m_acceptor(m_io, ip::tcp::endpoint(ip::tcp::v4(), 6688))
12     {
13         accept();
14     }
15     void run()
16     {
17         m_io.run();
18     }
19 private:
20     void accept()
21     {
22         sock_ptr sock(new socket_type(m_io));
23         m_acceptor.async_accept(*sock,
24             std::bind(&Server::accept_handler, this, std::placeholders::_1, sock));
25     }
26     void accept_handler(const boost::system::error_code& ec, sock_ptr sock)
27     {
28         if (ec)
29         {
30             return;
31         }
32         std::cout << "client:";
33         std::cout << sock->remote_endpoint().address() << std::endl;
34         sock->async_write_some(buffer("hello asio"),
35             std::bind(&Server::write_handler, this, std::placeholders::_1));
36         accept();
37     }
38     void write_handler(const boost::system::error_code&)
39     {
40         std::cout << "send msg complete." << std::endl;
41     }
42 private:
43     io_service m_io;
44     ip::tcp::acceptor m_acceptor;
45 };
46 int main()
47 {
48     try
49     {
50         std::cout << "server" << std::endl;
51         Server svr;
52         svr.run();
53     }
54     catch (std::exception& e)
55     {
56         std::cout << e.what() << std::endl;
57     }
58     return 0;
59 }

 

异步client:

 1 #include "stdafx.h"
 2 
 3 #include <boost/asio.hpp>
 4 #include <iostream>
 5 using namespace boost::asio;
 6 class Client
 7 {
 8     typedef ip::tcp::socket socket_type;
 9     typedef std::shared_ptr<socket_type> sock_ptr;
10 public:
11     Client() :m_ep(ip::address::from_string("127.0.0.1"), 6688)
12     {
13         start();
14     }
15     void run()
16     {
17         m_io.run();
18     }
19 private:
20     void start()
21     {
22         sock_ptr sock(new socket_type(m_io));
23         sock->async_connect(m_ep, std::bind(&Client::connect_handler, this, std::placeholders::_1, sock));
24     }
25     void connect_handler(const boost::system::error_code& ec, sock_ptr sock)
26     {
27         if (ec)
28         {
29             return;
30         }
31         std::cout << "receive from:" << sock->remote_endpoint().address() << std::endl;
32         sock->async_read_some(buffer(m_buf),
33             std::bind(&Client::read_handler, this, std::placeholders::_1));
34     }
35     void read_handler(const boost::system::error_code& ec)
36     {
37         if (ec)
38         {
39             return;
40         }
41         std::cout << m_buf << std::endl;
42     }
43 private:
44     io_service m_io;
45     ip::tcp::endpoint m_ep;
46     enum { max_length = 1024 };
47     char m_buf[max_length];
48 };
49 int main()
50 {
51     try
52     {
53         std::cout << "client start." << std::endl;
54         Client cl;
55         cl.run();
56     }
57     catch (std::exception& e)
58     {
59         std::cout << e.what() << std::endl;
60     }
61     getchar();
62     return 0;
63 }

 

posted @ 2016-12-15 15:41  rarator  阅读(3202)  评论(0编辑  收藏  举报