当前位置: 首页 > 工具软件 > SocketStream > 使用案例 >

扩展C++STL制作Socket Stream

莘俊能
2023-12-01

主页备案2个月了,还没成功,继续在这发点水言。

以前就有此想法,想想C++的iostream,那是多么滴方便,我感觉是比java I/O库还好用。内置缓冲机制,安全性与方便性都很优秀,那么可不可以扩展它做一个SocketStream出来,从而告别臃肿复杂的Berkly套接字呢?

我没实践过,但是答案是肯定滴,而且强人早已实现,我在此提供两个资料,其余后文都是废话,迫切找资料者可以略过。

SocketStream库: google关键字POCO。我相信你看了后会感谢我的,难得的Free C++ network library。Socket库只是冰山一角

扩展STL Stream: Standard C++ Library User Guide Volum2。

好了,以下都是废话了。

Stream的概念就是在IO与应用间加一个缓冲区,然后我们只需操作缓冲区即可完成IO操作。所以,要想制作SocketStream,我们得提供一个自定义SocketStreamBuf作缓冲,大概步骤就是:

让SocketStream继承std::ios,并且包含一个成员变量SocketStreamBuf,且它继承自std::basic_streambuf

然后对照资料实现各种虚函数,over。。。。

最后贴一个例子,可以看看POCO的socket库是多么方便:

EchoServer echoServer;
StreamSocket ss;
ss.connect(SocketAddress("localhost", echoServer.port()));
SocketStream str(ss);
str << "hello";
assert (str.good());
str.flush();
assert (str.good());
ss.shutdownSend();

char buffer[5];
str.read(buffer, sizeof(buffer));
assert (str.good());
assert (str.gcount() == 5);
assert (std::string(buffer, 5) == "hello");

ss.close();

 类似资料: