【问题标题】:How to make a TCP connection stay alive as long as possible to receive data如何使 TCP 连接尽可能长时间地保持活动状态以接收数据
【发布时间】:2019-09-15 22:20:06
【问题描述】:

我正在用 python 编写一个多处理服务器来接收来自多个客户端的数据。建立新连接后,首先数据传输正常。创建一个新进程来接收和处理数据流。如果客户端主动断开与服务器的连接,则关闭套接字并终止进程。


到目前为止一切正常。但是,当数据传输暂停一段时间后,recv() 函数似乎已关闭,无法再接收新数据。但是,根据 recv() 的返回值,连接似乎很好。尽管该进程仍然存在,但客户端必须重新连接服务器,这使得服务器为其创建一个新进程。

这是我服务器的主要代码:

def main():
    with socket(AF_INET, SOCK_STREAM) as s:
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        address = ('', 7788)
        s.bind(address)
        s.listen()
        while True:
            print('WAITING FOR CONNECTIONS...')
            newConn, newAddr = s.accept()
            with newConn:
                print('%s CLIENT ACCEPTED...' % newAddr[0])
                p = Process(target=recv, args=(newConn, newAddr))
                p.start()

def recv(newConn, newAddr):
    while True:
        recvData = newConn.recv(1024)
        if len(recvData) > 0:
            dataprocessing(recvData)
        else:
            print('%s CLIENT DISCONNECTED' % newAddr[0])
            break

我希望每个连接都能尽可能长地保持活动状态,以便随时接收来自客户端的新数据。为什么我的服务器不能正常工作?值得注意的是,当连接似乎死了,它既没有得到新的数据来处理,也没有打印出“CONNECTION DISCONNECTED”信息。这是为什么呢?

【问题讨论】:

  • 是什么导致数据传输暂停一段时间?是因为客户端决定停止发送一段时间,还是由于丢包/硬件问题(例如,有人暂时断开了以太网电缆)?在后一种情况下,TCP 层将检测到丢失的数据包并假设网络拥塞过多,并减慢 TCP 连接的传输速率以进行补偿——有时使其变得如此缓慢以至于它似乎被停止了(尽管它最终会恢复并再次加速,有时在数据包停止丢弃后)
  • 数据传输暂停是由于客户端发送数据中断。在我的情况下,套接字处于阻塞模式(默认)。
  • 你不能让它活着。你只能避免关闭它。如果它失败了,你必须关闭它,读取超时是防止网络故障和恶意客户端的基本防御。

标签: python sockets networking server


【解决方案1】:

尝试设置timeout 以及更好的异常处理和重新连接机制。您还应该参考setblocking

【讨论】:

  • 在我的情况下,套接字默认处于阻塞模式,我认为可以使用(少数客户端)。我看不到连接将如何断开,如果确实如此,哪个超时触发了该连接?如何保持 TCP 连接处于活动状态?
  • @Xin 我不懂 Python,但是读取超时是作为错误而不是作为流结束传递的,并且您当前的代码似乎将它们都视为流结束。
  • 事实上,客户端和服务器之间的数据传输是单向的,根据recv()的返回值应该认为连接是存活的。那么应该如何添加重连机制呢?
  • @Xin 事实是客户端没有给你发数据,或者网络没有传给你。从接收者的角度来看,这些条件是无法区分的,您需要同时防御它们,而您的军械库中唯一的武器就是读取超时。将其设置为您认为过度响应时间的任何值,通常比平均响应时间高两个或三个标准偏差,如果您得到它,请断开连接。如果您是服务器,则您无能为力。如果你是客户端,可以重连重试,满足幂等性要求。
猜你喜欢
  • 2018-01-23
  • 2019-09-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2012-11-26
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多