如何通过套接字接收超过 1440 个
How to receive more than 1440 through the socket
我在C++(Linux)中使用套接字编写了两个简单的程序服务器和一个客户端。最初它是一个示例客户端-服务器应用程序(回显消息发送和接收答案)。接下来,我更改了客户端以实现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 是一个缓冲区大小,我认为这对于用于测试的相对较小的网页来说绰绰有余。但正如我所提到的,我只收到 1440 字节。
当服务器的响应大于 1440 字节时,我可以使用 recv() 函数调用来捕获所有回复"部分"?
提前谢谢。
缓冲区大小由您无法控制的因素(路由器、ADSL 链路、IP 堆栈等)决定。传输大量数据的标准方法是重复调用recv()
。
HTTP在TCP上运行,为了更好地理解TCP套接字的工作,你必须将它们视为流而不是数据包。
为了进一步清楚,请阅读我之前的文章:将拆分的TCP数据包与闪存套接字重新组合
至于为什么你只收到1400(左右)字节,你必须了解MTU和碎片。总而言之,MTU(最大传输单位)是网络传输特定最大大小的单个数据包的能力。整个网络的 MTU 是所有涉及的路由器中最低的 MTU。如果尝试发送大小大于该网络的 MTU 的单个数据包,则会拆分数据包。
为了更好地理解 MTU 和碎片,请阅读:http://www.miislita.com/internet-engineering/ip-packet-fragmentation-tutorial.pdf
现在至于如何在缓冲区中接收整个页面,一种替代方法是继续调用recv()
并将您获得的数据附加到缓冲区中,直到recv()
返回zero
。这将起作用,因为通常Web服务器会在向您发送响应后关闭TCP连接。但是,如果 Web 服务器不关闭会话(也许配置了保持活动状态),则此技术将无法工作。
因此,正确的解决方案是继续接收,直到收到 HTTP 标头。看一眼并确定整个HTTP响应的长度(Content-Length:
),然后你可以继续接收,直到你收到你应该接收的确切字节数。
- 通过方法访问结构
- 通过递归进行因子分解
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 尝试通过多个向量访问变量时,向量下标超出范围
- C++如何通过用户输入删除列表元素
- 通过多个头文件使用常量变量
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何通过派生类函数更改基类中的向量
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- Ctypes wstring通过引用传递
- 变量没有改变?通过向量的函数调用
- 如何通过cpp程序运行shell脚本
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- QT通过C++添加映射QML项目
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- C++03 12.4/12对通过指针显式调用基类析构函数有何说明
- *val 和 &val 在 C++ 中通过引用传递时有何不同
- 如何通过套接字接收超过 1440 个