【问题标题】:C++: Problems inheriting std::basic_streambufC++:继承 std::basic_streambuf 的问题
【发布时间】:2015-07-28 20:45:32
【问题描述】:

我想继承std::basic_streambuf 来实现基于TCP 连接的流缓冲区。我不完全了解指针eback, gptr, egptr, pbase, pptr, epptr 的作用。我将流缓冲区视为一个实体,它只是让您从流中读取字符或将字符写入流,并可能重新定位读/写指针(在我的情况下不是)。这些指针对我来说没有意义,因为我正在考虑为输入和输出实现一个循环缓冲区(因此有可能,例如,gend < gbeg)。我真的必须实现这些指针(eback, gptr 等...),还是我可以将它们全部设置为nullptr,一切都会正常工作?或者有一些功能可以使用它们?

【问题讨论】:

  • 这里有一些代码可以检查(或直接使用)fdstream。您可以给fdstream 一个套接字文件描述符。或者GCC 具有stdio_filebuf 作为库扩展#include <ext/stdio_filebuf.h>。再次传递一个套接字文件描述符。

标签: c++ tcp stream network-programming iostream


【解决方案1】:

(首先,很高兴看到制作 TCP 流缓冲区而不是 TCP 流的决定。)

Angelika Langer 和 Klaus Kleft 对此有很好的了解,除了the book,这里是a whole section of tutorials

但是,streambufs 通常涉及大量样板代码,因此,对于像您这样的实际问题,我会使用 boost::iostreams,尤其是 source(对于源 tcp 流;显然使用 target另一种方式)。

请注意此类如何抽象出您提到的较低级别的操作。你基本上需要实现

std::streamsize read(char* s, std::streamsize n);

它会为你处理剩下的事情(没有太多开销)。

至于您(听起来很合理)使用循环缓冲区的想法,您可以使用boost::circular_buffer。或者,请参阅this question

【讨论】:

  • 谢谢,@Ami。我不确定我是否想使用 Boost,因为我的程序应该是跨平台的(包括 Android),而且似乎 Boost 不正式支持 Android。
  • 那么我建议 Langer & Kleft,尤其是。 here如果你没有这本书。
猜你喜欢
  • 2017-06-06
  • 2012-05-11
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多