C++ 如何保持HTTP长轮询连接打开?

C++ 如何保持HTTP长轮询连接打开?,c++,network-programming,long-polling,C++,Network Programming,Long Polling,我想在web服务中实现长轮询。我可以为客户端设置足够长的超时时间我可以给中间网络组件一个提示,让响应保持打开状态吗?我指的是NAT、病毒扫描程序、反向代理或周围的SSH隧道,它们可能位于客户端和服务器之间,而我不在我的控制之下 下载可能持续数小时,但空闲连接可能在不到一分钟内终止。这就是我想要阻止的。我是否可以通知中间网络,在这里我需要的是空闲连接,而不是因为服务器已断开连接 如果是,怎么做?我已经搜索了大约四个小时了,但我没有找到这方面的信息 我是否应该发送200 OK,可能发送一些标题,然

我想在web服务中实现长轮询。我可以为客户端设置足够长的超时时间我可以给中间网络组件一个提示,让响应保持打开状态吗?我指的是NAT、病毒扫描程序、反向代理或周围的SSH隧道,它们可能位于客户端和服务器之间,而我不在我的控制之下

下载可能持续数小时,但空闲连接可能在不到一分钟内终止。这就是我想要阻止的。我是否可以通知中间网络,在这里我需要的是空闲连接,而不是因为服务器已断开连接

如果是,怎么做?我已经搜索了大约四个小时了,但我没有找到这方面的信息

  • 我是否应该发送
    200 OK
    ,可能发送一些标题,然后什么也不发送
  • 我是否必须响应
    102处理
    而不是
    200确定
    ,然后一切正常
  • 我应该偶尔发送
    0x16
    (同步空闲)字节吗?如果是,在初始HTTP状态代码之前或之后,在标头之前或之后?他们是否将其放入传输的文件中,并且可能会将其破坏

Web服务/服务器使用Boost在C++中,返回的内容文件是海龟语法。

不能强迫代理延长空闲时间,至少没有管理访问权限。< /P> 好消息是,您可以设计长轮询解决方案,使其能够从突然关闭的连接中恢复

其中一种设计如下:

  • 由于长轮询通常用于事件通知(考虑观察者模式),因此可以将序列号与每个事件关联
  • 客户端发出一个GET请求,其中包含它看到的最后一个事件的序列号,作为URL的一部分或在cookie中
  • 服务器维护最近事件的缓冲区。在接收到来自客户端的GET请求后,它会根据缓冲事件的序列号和客户端提供的序列号检查是否需要将任何缓冲事件发送到客户端。如果是,则所有此类事件都在一个HTTP响应中发送。如果有一个代理想要在进一步中继之前缓冲整个响应,那么响应将在该点完成
  • 如果客户机是最新的,也就是说它没有错过任何缓冲事件,那么服务器将延迟其响应,直到生成另一个事件。当这种情况发生时,它将作为一个完整的HTTP响应发送
  • 当客户端收到响应时,它会立即发送一个新的响应。当它检测到连接已关闭时,会创建一个新连接并发出新请求

  • 当使用cookies传递客户端看到的最后一个事件的序列号时,客户端实现变得非常简单。实际上,您只需在客户端启用cookies,就这样。

    A也许?如果您只是阅读HTTP 1.1规范,那么这个选项应该非常清楚。我的意思是让响应保持打开状态。(我相应地更新了我的问题。)我认为长时间下载可能会持续几个小时,而没有响应可能会在不到一分钟后导致超时。例如,PuTTY有一些TCP保持活动选项。我想知道HTTP是否也能实现类似的功能。@有些程序员说,这不能保证连接和响应保持打开状态。这就是为什么实现长轮询的库必须能够在大超时后重新连接。@Paramaeleon要正确进行长轮询并不容易。在服务器端尤其困难,在服务器端,糟糕的实现可能会耗费大量资源。你为什么不用图书馆来做这个?为什么不使用诸如WebSocket或永久帧之类的其他技术呢?当然,重新连接是必须的。我想知道,通过让中间网络知道服务器端尚未脱机,是否可以很少保持所需的重新连接。您所描述的是正确的,这也是我已经计划要做的。我知道我无法在某个代理中骗过一次艰难的暂停。但是,例如,PuTTY有一些TCP保持活动选项。我想知道HTTP是否也能实现类似的功能− “伪造正在运行的下载”。它可能仍然会遇到一些最大传输超时,但应该避免任何数据超时。@Paramaeleon TCP keep alive在这种情况下不是非常有用,因为
    a)
    您无法控制它的间隔,
    b)
    它不是关于延长连接,而是关于在对等机死机(重新启动)时检测情况没有通知你。虽然可以通过随时间发送响应的小的无操作块来延长HTTP连接,但在存在代理的情况下,这种技巧并不可靠。@Paramaeleon事实上,延长连接的另一种方法是限制响应延迟的时间。当达到该限制时,您发出一个空响应,客户端提交一个新的响应。不过,始终存在代理超时设置为更小值的可能性。最后,我看不到在系统对突然关闭的连接具有鲁棒性时尝试延长连接的意义。