TCP异步服务端

核心功能和同步服务端的功能类似,例如以下:
class talk_to_client : public boost::enable_shared_from_this<talk_to_
client>
                        , boost::noncopyable {
typedef talk_to_client self_type;
       talk_to_client() : sock_(service), started_(false) {}
public:
       typedef boost::system::error_code error_code;
typedef boost::shared_ptr<talk_to_client> ptr;
       void start() {
started_ = true;

do_read(); }

       static ptr new_() {
ptr new_(new talk_to_client);
return new_;
       }
void stop() {
           if ( !started_) return;
started_ = false;
sock_.close();
       }
ip::tcp::socket & sock() { return sock_;}
...
   private:
ip::tcp::socket sock_;
enum { max_msg = 1024 };
char read_buffer_[max_msg];
char write_buffer_[max_msg];
bool started_;

};

由于我们是很easy的回显服务,这里不须要一个is_started()方法。

对每一个client,只读取它的消息,回显,然后关闭它。

do_read(),do_write()和read_complete()方法和TCP同步服务端的全然一致。
基本的逻辑相同是在on_read()和on_write()方法中:
void on_read(const error_code & err, size_t bytes) {
if ( !err) {
           std::string msg(read_buffer_, bytes);
           do_write(msg + "\n");
}

stop(); }

   void on_write(const error_code & err, size_t bytes) {
do_read();
}
对client的处理例如以下:
ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(),
8001));
void handle_accept(talk_to_client::ptr client, const error_code & err)
{
       client->start();
talk_to_client::ptr new_client = talk_to_client::new_();
acceptor.async_accept(new_client->sock(),
           boost::bind(handle_accept,new_client,_1));
   }
int main(int argc, char* argv[]) {
       talk_to_client::ptr client = talk_to_client::new_();
acceptor.async_accept(client->sock(),
           boost::bind(handle_accept,client,_1));
service.run();

}

每一次client连接到服务时,handle_accept被调用,它会异步地从client读取。然后相同异步地等待一个新的client。

代码
你会在这本书对应的代码中得到全部4个应用(TCP回显同步client,TCP回显同步服务端。TCP回显异步client,TCP回显异步服务端)。

当測试时,你能够使用随意client/服务端组合(比方。一个异步client和一个同步服务端)。


UDP回显服务端/client
由于UDP不能保证全部信息都抵达接收者,我们不能保证“信息以回车结尾”。
没收到消息,我们仅仅是回显,可是没有socket去关闭(在服务端)。由于我们是UDP。

UDP同步回显client
UDP回显client比TCP回显client要简单:
ip::udp::endpoint ep( ip::address::from_string("127.0.0.1"), 8001);
void sync_echo(std::string msg) {
       ip::udp::socket sock(service, ip::udp::endpoint(ip::udp::v4(), 0)
);
       sock.send_to(buffer(msg), ep);
char buff[1024];
ip::udp::endpoint sender_ep;
int bytes = sock.receive_from(buffer(buff), sender_ep);
std::string copy(buff, bytes);
       std::cout << "server echoed our " << msg << ": "
<< (copy == msg ? "OK" : "FAIL") << std::endl;
       sock.close();
}
   int main(int argc, char* argv[]) {
char* messages[] = { "John says hi", "so does James", "Lucy got
   home", 0 };
boost::thread_group threads;
for ( char ** message = messages; *message; ++message) {
           threads.create_thread( boost::bind(sync_echo, *message));
           boost::this_thread::sleep( boost::posix_time::millisec(100));
}
       threads.join_all();
}
全部的逻辑都在synch_echo()中;连接到服务端,发送消息。接收服务端的回显,然后关闭连接。

UDP同步回显服务端
UDP回显服务端会是你写过的最简单的服务端:
io_service service;
void handle_connections() {
       char buff[1024];
       ip::udp::socket sock(service, ip::udp::endpoint(ip::udp::v4(),
8001));
       while ( true) {
ip::udp::endpoint sender_ep;
int bytes = sock.receive_from(buffer(buff), sender_ep);
std::string msg(buff, bytes);
sock.send_to(buffer(msg), sender_ep);

} }

   int main(int argc, char* argv[]) {
handle_connections();

}

它非常easy,并且能非常好的自释。

我把异步UDPclient和服务端留给读者当作一个练习。

总结
我们已经写了完毕的应用。终于让Boost.Asio得以工作。

回显应用是開始学习一个库时很好的工具。你能够常常学习和执行这个章节所展示的代码,这样你就能够很easy地记住这个库的基础。

在下一章,我们会建立更复杂的client/服务端应用。我们要确保避免低级错误,比方内存泄漏,死锁等等。




Boost.Asio c++ 网络编程翻译(16)的更多相关文章

  1. Boost.Asio c++ 网络编程翻译(20)

    异步服务端 这个图表是相当复杂的:从Boost.Asio出来你能够看到4个箭头指向on_accept.on_read,on_write和on_check_ping. 着也就意味着你永远不知道哪个异步调 ...

  2. Boost.Asio c++ 网络编程翻译(14)

    保持活动 假如,你须要做以下的操作: io_service service; ip::tcp::socket sock(service); char buff[512]; ... read(sock, ...

  3. Boost.Asio c++ 网络编程翻译(26)

    Boost.Asio-其他特性 这章我们讲了解一些Boost.Asio不那么为人所知的特性.标准的stream和streambuf对象有时候会更难用一些,但正如你所见.它们也有它们的益处.最后,你会看 ...

  4. Boost.Asio c++ 网络编程翻译(11)

    *_at方法 这些方法在一个流上面做随机存取操作.你来指定read和write操作从什么地方開始(offset): async_read_at(stream, offset, buffer [, co ...

  5. Boost.Asio c++ 网络编程翻译(21)

    同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...

  6. Boost.Asio c++ 网络编程翻译(10)

    read/write方法 这些方法对一个流进行读写操作(能够是套接字,或者其它表现的像流的类): async_read(stream, buffer [, completion],handler):这 ...

  7. Boost.Asio c++ 网络编程翻译(18)

    同步服务端 同步服务端也相当简单.它须要两个线程,一个负责接收新的client.另外一个负责处理已经存在的client. 它不能使用单线程:等带一个新的client是一个堵塞操作,所以我们须要另外一个 ...

  8. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...

  9. 使用boost.asio实现网络通讯

    #include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...

随机推荐

  1. 神经网络中的激活函数——加入一些非线性的激活函数,整个网络中就引入了非线性部分,sigmoid 和 tanh作为激活函数的话,一定要注意一定要对 input 进行归一话,但是 ReLU 并不需要输入归一化

    1 什么是激活函数? 激活函数,并不是去激活什么,而是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余),这是神经网络能解决非线性问题关键. 目前知道的激活 ...

  2. js原生淘宝京东宝贝放大镜效果

    js实现商城放大镜效果 效果: 鼠标放上去会有半透明遮罩.右边会有大图片局部图. 鼠标移动时右边的大图片也会局部移动. 技术点: Event Event 是一个事件对象,当一个事件发生后,和当前事件发 ...

  3. 使用新的CSS类型对象模型

    el.attributeStyleMap.set('padding', CSS.px(42)); const padding = el.attributeStyleMap.get('padding') ...

  4. 第九课: - 导出到CSV / EXCEL / TXT

    第 9 课 将数据从microdost sql数据库导出到cvs,excel和txt文件. In [1]: # Import libraries import pandas as pd import ...

  5. 第二次作业&熟悉使用工具

     GIT地址  我的地址  GIT用户名  995020892w  学号后五位  81105  博客地址  我的博客  作业链接  第二次作业 一.环境配置过程 安装vs2017 因为以前学习C#相关 ...

  6. Android中图片旋转

    Activity_main.xml文件配置 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  7. 4185 Oil Skimming 最大匹配 奇偶建图

    题目大意: 统计相邻(上下左右)的‘#’的对数. 解法: 与题目hdu1507 Uncle Tom's Inherited Land*类似,需要用奇偶建图.就是行+列为奇数的作为X集合,偶尔作为Y集合 ...

  8. hdu2883 最大流,判断满流 优化的SAP算法

    这是09年的多校联赛题目,比10年的难度要大.如果没做过hdu3572,建议先去做.有了解题思维再来做这题. 这题与hdu3572类似.但是1 <= si < ei <= 1,000 ...

  9. hdu 2489 dfs枚举组合情况+最小生成树

    大家都说,搜索是算法的基础.今天最这题就有体会了.在n个顶点里选择m个顶点,求最小生成树.用到了深搜的回溯.所有情况都能枚举. #include<iostream> #include< ...

  10. SPOJ-CRAN02 - Roommate Agreement(前缀和)

    CRAN02 - Roommate Agreement Leonard was always sickened by how Sheldon considered himself better tha ...