在 C++/STL 中使用 recv 的最优雅方式?

rev*_*rev 1 c++ sockets stl

到目前为止,我所发现的有关使用套接字 ( recv)接收数据的所有内容都使用普通的旧 C 语言。

即使它是 C++,它要么在std::vector<char>(eww!)上逐字节接收,要么定义静态大小(例如vec.resize(BIG_NUMBER)),然后接收。

然而,所有这些似乎都非常低效和/或丑陋,所以我想知道,在 C++ 中最有效、最正确和最优雅的方法是什么?(不是 C)

Web 浏览器是某人需要接收未知数量数据的一个很好的例子。(Content-length为了示例而忽略标题)

Dav*_*aim 5

我不知道这样做的任何 STL 方法,但无论如何,STL 与它无关。在处理旧的 C API 时,可以简单地用 C++ 类包装混乱,使外部开发人员看不到实现。

我建议编写包含 SOCKET 作为内部成员的 Socket 类,而不是创建一些包装 C 的方法(假设我们谈论流套接字!):

std::string Socket::receive (){
char buffer [SOME_SIZE];
int bytesRead;

std::string receivedData;

do{
    bytesRead = recv(socket,buffer,SOME_SIZE-2,0);
    buffer [SOME_SIZE-1] ='/0';
    receivedData += buffer;
} while (bytesRead != 0 && bytesRead != SOCKET_ERROR );

return receivedData;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我怀疑你可能没有完全理解 recv() , recv() 填充一个缓冲区,只要你重复调用 recv() 它就会填充它。套接字接收的字节数不受缓冲区大小的限制。您可以使用此事实将数据附加到 std::string