如何通过sockets接收1440多个

我用C ++(Linux)编写了两个简单的程序服务器和一个使用套接字的客户端。 最初它是一个示例客户端 – 服务器应用程序(echo-message发送和接收答案)。 接下来,我更改了客户端以实现HTTP GET(现在我不再使用我的示例服务器)。 它工作,但是无论我设置的缓冲区大小,客户端只接收1440字节。 我想要整个页面进入缓冲区。 我认为这与TCP属性有关,我应该在客户端代码中实现某种循环来捕获答案的所有部分。 但是我不知道我该做什么。

这是我的代码:

... int bytesSent = send(sock, tmpCharArr, message.size()+1, 0); // Wait for the answer. Receive it into the buffer defined. int bytesRecieved = recv(sock, resultBuf, 2048*100, 0); ... 

2048 * 100是一个缓冲区大小,我认为这对于用于testing的相对较小的WEB页来说已经足够了。 但正如我所提到的,我只收到1440字节。

当服务器的响应大于1440字节时,我可以用recv()函数调用捕获所有答复“部分”?

提前致谢。

缓冲区大小取决于您的控制之外的因素(路由器,ADSL链路,IP堆栈等)。 传输大量数据的标准方式是重复调用recv()

HTTP通过TCP工作,并且理解TCP套接字的工作更好,您必须将它们视为流而不是数据包。

为了进一步的清晰,请阅读我之前的文章: 用闪存套接字重组拆分TCP数据包

至于为什么你只收到1400(左右)字节,你必须了解MTU和碎片。 综上所述,MTU(Maximum Transmission Unit,最大传输单元)是网络传输某个最大尺寸的单个数据包的能力。 整个网络的MTU是所有涉及路由器的最低MTU。 如果您尝试发送一个大于该网络MTU的单个数据包,则分片会分裂数据包。

为了更好地理解MTU和碎片,请阅读: http : //www.miislita.com/internet-engineering/ip-packet-fragmentation-tutorial.pdf

现在至于如何接收缓冲区中的整个页面,另一种方法是继续调用recv()并将获取的数据附加到缓冲区中,直到recv()返回zero 。 这将起作用,因为通常情况下,Web服务器在向您发送响应之后将关闭TCP连接。 但是,如果Web服务器没有关闭会话,这种技术将无法工作(也许keep-alive是配置)。

因此,正确的解决方案将是保持接收,直到您收到HTTP头。 看一眼,确定整个HTTP响应Content-Length:Content-Length: ,然后您可以继续接收,直到您收到您应该接收的字节的确切数量。