【发布时间】:2017-08-15 17:35:22
【问题描述】:
我想在 Web 服务中实现长轮询。我可以在客户端上设置足够长的超时时间。 我能否提示中间网络组件以保持响应 开放?我的意思是 NAT、病毒扫描程序、反向代理或可能位于客户端之间的周围 SSH 隧道而服务器和我都不受我的控制。
下载可能会持续数小时,但空闲连接可能会在不到一分钟的时间内终止。这是我要防止的。我可以通知中间网络我在这里想要一个空闲连接,而不是因为服务器已断开连接吗?
如果是这样,怎么做?我已经搜索了大约四个小时,但没有找到这方面的信息。
- 我应该发送
200 OK,也许是一些标题,然后什么都没有? - 我必须回复
102 Processing而不是200 OK,然后一切都很好吗? - 我应该不时发送
0x16(同步空闲)字节吗?如果是这样,在初始 HTTP 状态代码之前还是之后,在标头之前还是之后?他们是否将其放入传输的文件中,并且可能会破坏它?
Web 服务/服务器使用 Boost 使用 C++ 编写,返回的内容文件使用 Turtle 语法。
【问题讨论】:
-
也许是HTTP persistent connection?如果您只是阅读 HTTP 1.1 规范,那么该选项应该已经很清楚了。
-
我的意思是保持响应打开。 (我相应地更新了我的问题。)我认为长时间的下载可能会持续几个小时,而没有响应可能会在不到一分钟后导致超时。例如,PuTTY 有一些 TCP keep-alive 选项。我想知道 HTTP 是否也可以实现类似的功能。
-
@Someprogrammerdude 这并不能保证连接 和响应 将保持打开状态。这就是实现长轮询的库必须能够在长时间超时后重新连接的原因。
-
@Paramaeleon 获得长轮询权不容易。在服务器端尤其困难,糟糕的实现会耗费大量资源。你为什么不为此使用图书馆?为什么不使用一些 other 技术,例如 WebSockets 或永久帧?
-
当然,重新连接是必须的。我想知道是否可以通过让中间网络知道服务器端尚未离线来保持所需的重新连接很少。
标签: c++ network-programming long-polling