我想使用实时TCP连接,我有一个来自服务器的数据流,我是由客户端接收的,但是这个客户端太慢而无法像发送者一样快地接收,所以服务器缓冲了数据,直到它到达目的地,例如,如果我"生产"在时间t的数据,并且假设客户端慢10倍,那么在时间t产生的数据将在时间10t到达。
我想制作服务器" drop"目前无法到达客户端的数据,并发送预计在当时到达的新数据?
B.S:我知道UDP协议会这样做,但我想通过TCP来做到这一点。
答案 0 :(得分:1)
我过去做过这样的事情,并取得了相当不错的成绩。以下是我的表现方式:
1)在发送方,使用setsockopt(SOL_SOCKET,SO_SNDBUF)使服务器的TCP套接字的发送缓冲区尽可能小(因为你不能掉线)数据一旦已经在套接字的发送缓冲区中,您希望尽可能少地保存数据)
2)在发送方,从不主动将任何传出数据()发送到套接字。相反,编写一个函数(我们称之为DumpCurrentStateToBuffer())来写入"当前状态"字节(您要发送到客户端)到内存缓冲区。
3)当客户端的socket选择()(或者poll(),或者你使用的任何机制)作为ready-for-write时,调用DumpCurrentStateToBuffer()来创建要发送到客户端的字节的内存缓冲区。现在将该数据发送到客户端(如果您正在使用阻止I / O,则可以同步执行此操作,代价是可能会停止服务器,直到可以发送数据;如果您使用非数据,则为OTOH阻塞I / O,您可能需要将内存缓冲区和当前发送的字节索引作为状态变量保存到缓冲区中,这样每当套接字指示时,您可以随时间继续发送更多内存缓冲区的子块。它可以接收更多的字节)
4)一旦内存缓冲区的内容完全发送,你就可以释放内存缓冲区,然后等待套接字再次选择准备就绪;当它发生时,转到(3)。
这项技术并不能解决所有TCP的非实时问题;例如,丢弃的TCP数据包仍然必须重新发送给客户端。它所做的是保证客户端到服务器数据积压永远不会超过一个或两个状态"很长,因为除非/直到套接字输出缓冲区中至少有一些空间,否则你永远不会生成任何新数据。