Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用回调或事件拥有std::istream,以避免拉取或阻塞读取_C++_C++11 - Fatal编程技术网

C++ 使用回调或事件拥有std::istream,以避免拉取或阻塞读取

C++ 使用回调或事件拥有std::istream,以避免拉取或阻塞读取,c++,c++11,C++,C++11,我想使用自己的std::istream实现来封装tcp/ip套接字。目前我面临的主要问题是,在事件驱动系统中,我不想阻止读取操作。我搜索的是一种注册回调/事件的标准方法,以告知消费单元有字节要读取。我在std::iostream区域没有找到任何东西。是否有conform解决方案,或者我仍然需要引入自己的函数绑定接口?std::iostream正在阻塞,并且没有检测可用字节数的标准方法。你必须介绍你的界面 std::istream::readsome并将从其内部缓冲区执行非阻塞读取,但不会检查套接

我想使用自己的std::istream实现来封装tcp/ip套接字。目前我面临的主要问题是,在事件驱动系统中,我不想阻止读取操作。我搜索的是一种注册回调/事件的标准方法,以告知消费单元有字节要读取。我在std::iostream区域没有找到任何东西。是否有conform解决方案,或者我仍然需要引入自己的函数绑定接口?

std::iostream正在阻塞,并且没有检测可用字节数的标准方法。你必须介绍你的界面

std::istream::readsome
并将从其内部缓冲区执行非阻塞读取,但不会检查套接字是否需要重新填充缓冲区。它有时可以为您工作,但在其他时候,他们只会坚持没有更多的数据,即使数据已发送到程序。有关更多信息,请参见此问题:


指出,这是您正在寻找的接口,但仅在一些C++实现中有效地实现。但是,由于您正在创建替换缓冲区,因此您可以在缓冲区类中按照自己的意愿简单地重载/实现此函数

你看过吗?它提供了一个可以执行您所需操作的流。

iostream
s(没有
std::stream
)对流进行操作。他们不知道自己在哪里读书;这是在
std::streambuf
中处理的,您希望自定义它以抽象其他数据源/目标。@black我查看了streambuf,但它没有为我的事件驱动应用程序提供我想要的那种流控制。我希望有一些std读/写接口。为流创建一个线程或者(如果您在Unix上)使用怎么样。对于
streambuf
尝试,对于
istream
使用@MartinSchlott:我100%同意。我真希望有一个非阻塞函数来检查可用字节:(实际上有一种方法:使用
istream::readsome
streambuf::showmanyc
(请参阅我对这个问题的其他评论)@MooingDuck实际上,如果
streambuf
的内部缓冲区是空的,它将调用
streambuf::showmanyc
,这将给出
underflow
返回的
char
的数量。请参阅@MooingDuck我的意思是,套接字的自定义
streambuf
可以返回内核缓冲区中当前的字符数参见@programmerjake:Valid point中的FIONREAD。编写一个
showmanyc
是一个好主意!