C中的HTTP:为什么我必须多次调用recv()?

Pro*_*mer 4 c sockets http winsock2 web

我开始学习C(套接字)和Internet协议中的网络编程.

目前我专注于HTTP.

在使用C实现HTTP客户端的(非常)短暂体验期间,我发现有时您必须多次调用recv()才能从服务器获取整个消息 - 即使客户端没有向客户端发送消息服务器之间的单独调用recv().

例如:

当我尝试使用recv()调用实现HTTP客户端时,我只得到了标题(我想,我仍然是HTTP的新手).但是当我两次调用recv()时,我在第一次调用中获得了头文件,在第二次调用中获得了body(html代码).

这不是短缓冲区的问题,因为我使用的缓冲区足够长以容纳整个消息.

为什么会这样?虽然没有客户端发送的新数据,但客户端必须多次调用recv()的原因是什么?我认为如果客户端没有向服务器发送新数据,对recv()的调用将带来服务器的整个响应.

我不认为这是我的代码的问题,但如果你要问代码,我可以在这里发布它没有问题.我认为这是不必要的,如果我错了,请纠正我.

我不认为这是相关的,但我正在使用Winsock2.

Kar*_*ath 7

TCP被设计为面向流的.接收方对发送的消息/数据包一无所知.它看到的只是一个简单的字节流.

所以你想像"我发了一条消息",但是recv()只收到了一半.事实是,你从未发过邮件.您发送了一堆字节,并且您无法期望通过一次调用接收所有这些字节.您可以通过1,2或多个电话接收它们; 您可以收到上一个"消息"的结尾以及下一个消息的开头,依此类推.

唯一的保证是您将按照它们发送的相同顺序接收字节,并且在流关闭之前您将永远不会收到0字节.这就是网络API的工作方式,你必须习惯它.

  • 就像流一样,如果您想要所有内容,则必须继续阅读,直到收到流结束指示。没有承诺如何在这些读取中分配数据;这纯粹是代码编写方式以及使用的缓冲区大小的产物。 (2认同)