2016-08-23 44 views
0

我一直在寻找StackOverFlow上的解决方案,似乎无法找到答案,我使用WinSock2登录到网站,服务器响应“连接:关闭“(即使我发送连接:保持活动)在标题中。任何消息试图返回0(0 =正常关闭)C++ - 连接关闭后发送HTTP POST/GET

问题后RECV:

  1. 是连接假设POST请求之后下降?

  2. 如何在下降后发送后续GET/POST请求?

所以,你必须回收套接字并重新建立一切,像我下面的例子吗?事件的列表(即我想像我需要做的)的

例子:

  1. 调用WSAStartup
  2. 查找地址
  3. 地址为
  4. 创建插座
  5. 连接插座
  6. 发送Post Request

---连接后后关闭---

  1. 销毁插槽
  2. 创建插座
  3. 连接插座与地址
  4. 发送Get请求与验证cookie

这是我图片事件链看起来像,但我不是100%确定浏览器如何处理这一切。但我从其他用户的经验和输入中学习,如果有人知道发生了什么让我知道。谢谢你的时间,

+1

你在POST命令中发送HTTP/1.0或HTTP/1.1吗? – Barmar

+0

我正在为POST发送HTTP/1.1。 –

+0

您的请求中是否有“连接:保持活动”标题?即使HTTP/1.1的默认模式是保持连接处于活动状态,但所有客户端仍然始终发送此标头,并且服务器可能依赖于此标头。 – Adrien

回答

2

连接是否在POST请求后丢弃?

它可以,是的。 HTTP是一种无状态协议,即使请求保持活动状态,也不能保证连接在响应后保持活动状态。在发送响应之后是否关闭连接由服务器决定,如果客户端没有请求关闭连接。

如何在下降后发送后续的GET/POST请求?

在发送新的请求之前,您别无选择,只能重新连接到服务器以及涉及(TCP握手,SSL/TLS握手等)的所有内容。

如果您:

  • 发送一个HTTP 1.0请求明确说明Connection: keep-alive,或接收HTTP 1.0应答明确规定Connection: keep-alive

  • 发送一个HTTP 1.1请求明确声明Connection: close或接收明确声明的HTTP 1.1响应Connection: close

然后,你必须读取响应后关闭连接的结束。

即使响应指示保活生效,连接仍然超时,关闭您发送相同的连接上你的下一个请求之前。因此,任何时候你想发送一个新的请求,如果连接已经被关闭,或者你在发送请求时发生连接错误,关闭套接字,重新连接并重新发送请求。

那么,你必须回收套接字并重新建立所有的东西,像我下面的例子吗?

潜在的,是的。

我不知道浏览器是如何处理这一切100%。

究竟如上所述。

这在RFC 2616 Section 8 "Connections"进一步讨论。

+0

感谢您的输入!我只是想确保这是在我通过HTTP响应进行解析之前采取的正确行动。 (我喜欢尝试处理我自己的一切,这就是为什么我不使用库) –