C++ - 连接关闭后发送 HTTP POST/GET

C++ - Sending HTTP POST/GET after connection has closed

我一直在 Whosebug 上搜索解决方案但似乎找不到答案,我正在使用 WinSock2 登录网站并且服务器响应 "Connection: close"(即使我发送连接: keep-alive) 在 header。在 returns 0 之后尝试接收任何消息。(0 = 正常关闭)

问题:

  1. 连接是否应该在 POST 请求后断开?

  2. 掉线后如何发送后续的GET/POST请求?

所以你是否必须像我下面的例子一样回收套接字和re-establish所有东西?

事件列表示例(我想我需要做的):

  1. WSA 启动
  2. 查找地址
  3. 创建套接字
  4. 使用地址连接套接字
  5. 发送Post请求

---Post---

后连接关闭
  1. 销毁套接字
  2. 创建套接字
  3. 使用地址连接套接字
  4. 发送带有身份验证 Cookie 的获取请求

这是我想象的事件链的样子,但我不是 100% 确定浏览器如何处理所有这些。但我从其他用户的经验和意见中学习,所以如果有人确切知道发生了什么,请告诉我。谢谢你的时间,

Is the connection suppose to drop after a POST request?

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

How do you send subsequent GET/POST requests after it has dropped?

您别无选择,只能重新连接到服务器,并在发送新请求之前进行所有相关操作(TCP 握手、SSL/TLS 握手等)。

如果你:

  • 发送 明确声明 Connection: keep-alive 的 HTTP 1.0 请求,或接收 未明确声明的 HTTP 1.0 响应 明确说明 Connection: keep-alive

  • 发送明确声明 Connection: close 的 HTTP 1.1 请求,或接收明确声明 Connection: close

    的 HTTP 1.1 响应

然后您必须在阅读响应后关闭您的连接端。

即使响应表明保持活动状态有效,连接仍可能超时并在您在同一连接上发送下一个请求之前关闭。

所以,任何时候你想发送一个新的请求,如果连接之前已经关闭,或者你在发送请求时遇到连接错误,关闭套接字,重新连接,然后重新发送请求。

So do you have to recycle the socket and re-establish everything again like my example below?

可能,是的。

I am not 100% sure how browsers handle all this.

完全如上所述。

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