【问题标题】:TCP connection for real time实时 TCP 连接
【发布时间】:2015-04-26 16:46:33
【问题描述】:

我想使用实时 TCP 连接,我有来自服务器的数据流,我通过客户端接收它,但是这个客户端太慢,无法像发送者一样快,所以服务器缓冲数据直到到达目的地,例如,如果我在时间 t“生成”数据,并假设客户端慢了 10 倍,那么在时间 t 生成的数据将在时间 10t 到达。

我想让服务器“丢弃”当前无法到达客户端的数据,并发送预计此时到达的新数据?

B.S : 我知道 UDP 协议可以做到这一点,但我想通过 TCP 做到这一点。

【问题讨论】:

  • @CodeCaster,所以除了处理udp没有办法吗?但问题是服务器使用 TCP 连接,他给我没有选择
  • 有多种方法,见proposed dupe
  • @CodeCaster,我想做一个中间客户端,它从服务器接收数据并通过UDP将数据重新发送到原始客户端,这将满足我的需求,对吧?
  • 这是可能的,前提是该客户端接收速度足够快。

标签: sockets tcp


【解决方案1】:

我过去做过这种事情,并且得到了相当好的结果。我是这样做的:

1) 在发送端,使用 setsockopt(SOL_SOCKET, SO_SNDBUF) 使服务器的 TCP 套接字的发送缓冲区尽可能小(因为一旦数据已经在套接字的发送缓冲区中,您就不能丢弃数据,您希望尽可能少地保留数据)

2) 在发送端,永远不要主动将任何传出数据发送()到套接字中。相反,编写一个函数(我们将其称为 DumpCurrentStateToBuffer())将“当前状态”字节(您要发送到客户端)写入内存缓冲区。

3) 当客户端的套接字 select()(或 poll(),或您使用的任何机制)准备好写入时,调用 DumpCurrentStateToBuffer() 以创建要写入的字节的内存缓冲区发送给客户。现在将该数据发送到客户端(如果您使用阻塞 I/O,则可以同步执行此操作,但代价是可能会在可以发送数据之前停止服务器;如果您使用的是非阻塞 I/O,则为 OTOH ,您可能需要将内存缓冲区和当前已发送字节索引作为状态变量保留在缓冲区中,因此您可以随着时间的推移继续发送更多的内存缓冲区子块,只要套接字表明它可以接收更多字节)

4) 一旦内存缓冲区的内容发送完毕,就可以释放内存缓冲区,然后等待套接字再次选择为准备写入;完成后,转到 (3)。

这种技术并不能解决 TCP 的所有非实时问题;例如,丢弃的 TCP 数据包仍需重新发送给客户端。它所做的是保证客户端到服务器的数据积压永远不会超过一两个“状态”,因为除非/直到套接字的输出缓冲区中至少有一些空间,否则您永远不会生成任何新数据。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多