【发布时间】:2015-03-22 09:25:45
【问题描述】:
我有一个产生数据的服务器,客户端接收这些数据。只是服务器太快了,客户端超载了。最终,服务器将阻止他的发送操作。
现在,我对来自服务器的旧数据并不真正感兴趣,相反,服务器可以跳过一些消息,只发送对客户端真正重要的信息。
在客户端,我可以使用Client.Available 找出流中还剩下多少数据,但我不知道如何在服务器/发送方上获取这个数字。我可以更改 SendBufferSize,但我会知道 SendBuffer 中有多少可用空间并相应地做出反应。
我可以让客户报告他落后了多少,但这感觉就像在应用程序级别重新发明了 TCP 协议。另外,我不相信已经很慢的客户端会及时警告我的服务器。
有什么方法可以读取 TCP 使用/未使用的窗口大小或发送缓冲区?
【问题讨论】:
-
“我对来自服务器的旧数据并不感兴趣,相反,服务器可以跳过一些消息” - 使用 UDP。
-
哎呀,不,服务器发送的所有数据都应该到达,我说我可以跳过消息,而不是跳过数据包。
-
那不计算。一条消息可以跨越一个或多个数据包,因此如果您可以跳过消息,则可以跳过数据包。 TCP是不能跳过的流,所以如果一定要能跳过,就不能用TCP。
-
一个数据包也可以跨越一个或多个消息,另外,如果一个消息跨越多个数据包,丢弃半个消息是不安全的,更不用说我不想手动重新排序我的数据包客户到达时出现故障。 TCP 为我做了这一切,这很好。
-
“我不想”并不是“你必须”的真正答案。使用 TCP,你必须按顺序消费所有的数据包,但如果你想实时这样做,你必须更快地消费,这是你做不到的。但是,您可以创建另一个“ack”层;让客户端告诉服务器它已经收到一条消息,如果服务器确定客户端滞后,让服务器跳过发送消息。