在网络库上工作的时候,我最近注意到,对于异步I / O,使用basic_streambuf :: in_avail和一个writeome函数的挂件非常方便。
如果有任何功能可以满足这些要求,我已经搜索了网页并检查了几个C ++引用,但似乎我没有运气。提到类似功能的唯一来源是Boost's Asio库,但是描述清楚地说明函数调用将阻塞,直到至少发送一个字节,这不反映我想要的行为。
为了详细说明我的问题,我根据C ++ N3337出版物创建了草稿。
27.6.3.2.5放置区域[streambuf.pub.put]
streamsize in_depart();
返回:如果写入位置可用,则返回
epptr() - pptr()
。除此以外 返回showmanycp()
。27.6.3.4.5放置区域[streambuf.virt.put]
streamsize showmanycp();
返回:可以写入序列的字符数估计值, 或
-1
。如果它返回正值,则不会连续调用overflow()
返回traits::eof()
,直到至少写入该字符数为止 流。如果showmanycp()
返回-1
,则对overflow()
的调用将失败。默认行为:返回零。
备注:使用
traits::eof()
。27.7.3.7未格式化的输出函数[ostream.unformatted]
streamsize writesome(char_type* s, streamsize n);
效果:表现为无格式输出函数(如27.7.3.7中所述) 1)。构建哨兵对象后,
!good()
可以调用setstate(failbit)
抛出异常,然后返回。否则写n
指定的s
个字符。如果rdbuf()->in_depart() == -1
,调用setstate(badbit)
(可能会抛出ios_base::failure
(27.5.5.4)),并且不写任何字符;- 如果
rdbuf()->in_depart() == 0
,则不写任何字符。- 如果
rdbuf()->in_depart() > 0
,则写入min(rdbuf()->in_depart(), n))
个字符。返回:写入的字符数。