gpt4 book ai didi

c - C 中的 HTTP : Why do I have to call recv() multiple times?

转载 作者:太空狗 更新时间:2023-10-29 15:19:52 24 4
gpt4 key购买 nike

我已经开始学习使用 C(套接字)和互联网协议(protocol)进行网络编程。

目前我专注于 HTTP。

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

例如:

当我尝试通过调用 recv() 来实现 HTTP 客户端时,我只得到了 header (我认为,我仍然是 HTTP 的新手)。但是当我两次调用 recv() 时,我在第一次调用中得到了标题,在第二次调用中得到了正文(html 代码)。

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

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

我认为这不是我的代码的问题,但如果您要索取代码,我可以将其张贴在这里。我只是认为这是不必要的,如果我错了请纠正我。

我认为这不相关,但我使用的是 Winsock2。

最佳答案

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

所以你认为“我发送了一条消息”,但 recv() 只收到了一半。事实是,您从未发送过消息。你发送了一堆字节,你不能期望所有的字节都被一次调用接收到。您可以在 1 个、2 个或多个电话中收到它们;您可能会收到上一条“消息”的结尾和下一条“消息”的开头,依此类推。

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

关于c - C 中的 HTTP : Why do I have to call recv() multiple times?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com