read/write方法

这些方法对一个流进行读写操作(能够是套接字,或者其它表现的像流的类):

async_read(stream, buffer [, completion],handler):这种方法异步地从一个流读取。结束时,处理方法被调用。处理方法的格式是:void handler(const boost::system::error_ code & err, size_tbytes);。你能够选择指定一个完毕处理方法。完毕处理方法会在每一个read操作调用成功之后调用,然后告诉Boost.Asio async_read操作是否完毕(假设没有完毕,它会继续读取)。它的格式是:size_t completion(const
boost::system::error_code& err, size_tbytes_transfered) 。当这个完毕处理方法返回0时,我们觉得read操作完毕;假设它返回一个非0值,它表示了下一个async_read_some操作须要从流中读取的字节数。

接下来会有一个样例来具体展示这些。

async_write(stream, buffer [, completion],handler):这种方法异步地向一个流写入数据。參数的意义和async_read是一样的。

read(stream, buffer [, completion]):这种方法同步地从一个流中读取数据。參数的意义和async_read是一样的。

rite(stream, buffer [, completion]):  这种方法同步地向一个流写入数据。參数的意义和async_read是一样的。

°  async_read(stream,stream_buffer [, completion], handler)

°  async_write(strean,stream_buffer [, completion], handler)

°  write(stream, stream_buffer[, completion])

°  read(stream, stream_buffer[, completion])

首先,要注意第一个參数变成了流,而不单是socket。这个包括了socket但不不过socket。比方,你能够用一个Windows的文件句柄来替代socket。

当以下情况出现时,全部read和write操作都会结束:

可用的缓冲区满了(当读取时)或者全部的缓冲区已经被写入(当写入时)。

完毕处理方法返回0(假设你提供了这么一个方法)

发生错误时

以下的代码会异步地从一个socket中间读取数据直到读取到’\n’:

io_service service;

ip::tcp::socket sock(service);

char buff[512];

size_t up_to_en

int offset = 0;

stem::error_code &, size_t bytes) {

ter(const boost::s

y

for( size_t i = 0; i < bytes; ++i)

if ( buff[i + offset] == '\n')

return 0;

return 1;

}

void on_read(const boost::system::error_code &, size_t) {}

...

c_read(sock, buffer(buff), up_to_enter,on_read);

asy

n

Boost.Asio也提供了一些简单的完毕处理仿函数:

• transfer_at_least(n)

• transfer_exactly(n)

• transfer_all(

)

样例例如以下:

char buff[512];

void on_read(constboost::system::error_code &, size_t) {}

// 读取32个字节

async_read(sock, buffer(buff),transfer_exactly(32), on_read);

上述的4个方法,不使用普通的缓冲区,而使用由Boost.Asio的std::streambuf类继承来的stream_buffer方法,stl流和流缓冲区很复杂;以下是样例:

io_service service;

void on_read(streambuf& buf, constboost::system::error_code &,

size_t) {

std::istream in(&buf);

std::string line;

std::getline(in, line);

std::cout << "first line: "<< line << std::endl;

}

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

HANDLE file =::CreateFile("readme.txt", GENERIC_READ, 0, 0,

OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,

0);

windows::stream_handle h(service, file);

streambuf buf;

uf, transfer_exactly(256),

async_read(h,

b

boost::bind(on_read,boost::ref(buf),_1,_2));

service.run();

}

在这里,我向你们展示了在一个Windows文件句柄上调用async_read。我们读取了前面的256个字符,然后把它们保存到缓冲区,当操作结束时。on_read被调用,然后创建std::istream来传递缓冲区,读取第一行(std::getline),最后把它输出到命令行中。

read_until/async_read_until方法

这些方法在条件满足之前一直读取:

async_read_until(stream, stream_buffer,delim, handler):这种方法启动一个异步read操作。read操作会在读取到某个分隔符时结束。分隔符能够是字符,std::string或者boost::regex。处理方法的格式为:void handler(const boost::system::error_code & err, size_tbytes);。

async_read_until(strem, stream_buffer,completion, handler):这种方法和之前的方法是一样的,可是没有分隔符,而是一个完毕处理方法。完毕处理方法的格式为:pair<iterator,bool> completion(iterator begin, iterator end);,当中迭代器的类型为buffers_iterator<streambuf::const_buffers_type>。你须要记住的是迭代器的类型是随机訪问的迭代器。你扫描整个区间(begin,end),然后认为read操作是否应该结束。你会返回一个结果对,第一个成员是一个指向最后被这种方法訪问的字符的迭代器;第二个成员当read操作须要结束时返回true,否则返回false。

read_until(stream, stream_buffer, delim):这种方法运行一个同步的read操作,參数的意义和async_read_until一样。

read_until(stream, stream_buffer,completion):这种方法运行一个同步的read操作,參数的意义和async_read_until一样。

以下这个样例会一直读取直到读到一个指定的标点符号

typedefbuffers_iterator<streambuf::const_buffers_type> iterator;

std::pair<iterator, bool>match_punct(iterator begin, iterator end) {

while ( begin != end)

if ( std::ispunct(*begin))

return std::make_pair(begin,true);

return std::make_pair(end,false);

}

void on_read(constboost::system::error_code &, size_t) {}

...

streambuf buf;

async_read_until(sock, buf, match_punct,on_read);

假设我们想读到一个空格结束,我们须要把最后一行改动为:

async_read_until(sock, buff, ' ', on_read);

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

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

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

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

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

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

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

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

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

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

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

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

    TCP异步服务端 核心功能和同步服务端的功能类似,例如以下: class talk_to_client : public boost::enable_shared_from_this<talk_ ...

  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. 使用 Bluemix™ Live Sync 高速更新 Bluemix 上执行的应用程序实例

    假设您要构建 Node.js 应用程序,那么能够使用 IBM® Bluemix® Live Sync 高速更新 Bluemix 上的应用程序实例,并像在桌面上进行操作一样进行开发,而无需又一次部署.执 ...

  2. 2.Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC)-

    转自:https://blog.csdn.net/a214919447/article/details/55260411 SOAP(Simple Object Access Protocol,简单对象 ...

  3. 记阮一峰---JavaScript 标准参考教程之标准库-Object对象

    在看到阮大神的-标准库-Object对象时 有个 类型判断类型 方法可能以后会用到.特此记录一下 4.3:toString()的应用:判断数据类型 Object.prototype.toString方 ...

  4. 洛谷 P1032 字符变换

    洛谷 P1032 字符变换 题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多 6 个规则): A1​ -> B1​ A2​ -> B2​ 规则的含义为:在 A 中的子串 A1​ ...

  5. 配置mysql的ODBC数据源

    如果你已经安装好了mysql和mysql连接驱动,则可以向下进行了 打开控制面板,以小图标的形式查看,找到管理工具 打开管理工具,找到数据源(odbc),打开 在图片中所圈出的三个标签中随便选一个,点 ...

  6. jsp+tomcat+ 创建project 配置project

    *如今我们已经下载到了 tomcat 7.0+ eclipse for java ee 直接解压,打开eclipse. 接下来是步骤: eclipse 打开的界面.空空如也 ! ..* 点击 file ...

  7. vsphere client 参数

    转自:http://blog.163.com/sword_111/blog/static/66589416201422964544918/ C:\Program Files (x86)\VMware\ ...

  8. Python中的文本(一)

    本文主要记录和总结本人在阅读<Python标准库>一书,文本这一章节的学习和理解. 事实上在Python中,使用文本这种一些方法是特别经常使用的一件事.在一般的情况下,都会使用String ...

  9. STL_算法_删除(unique、unique_copy)

    C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) 全部容器适用 unique(b,e) unique(b,e,p) unique_copy(b1,e1,b2) unique ...

  10. LaTeX indicator function(指示函数)(\mathbb {1} 不起作用)

    问题说明: \mathbb字符的空心化显示仅对字符有效,对数字无效. 解决方法: 使用 bbm 包 \documentclass{article} \usepackage{bbm} \begin{do ...