Linux 上的 Python 网络编程 - 在客户端上同时使用两个网络接口



目前我的客户端上有两个网络接口。我创建了两个单独的套接字,它们绑定到每个接口 ip。现在我还有两台服务器,每台服务器都与客户端上的一个套接字通信。我希望能够同时从两个接口(当前使用 UDP 或 DGRAMS)接收数据(目前为 ~10MB,但稍后会更大),但由于某种原因,它总是存在延迟,因为它必须完成一个套接字的数据传输,然后才能开始在另一个套接字上传输。

我已经确认绑定每个接口是成功的,并且我能够在每个套接字上与其各自的服务器进行通信。目前,我只是在同一代码块中执行s1.recv()s2.recv()

所以我的问题是,延迟是由于使用recv()的"阻止"功能造成的吗?另外,通过我的搜索,似乎有办法使该功能解锁?但我不确定该怎么做...这会通过使用多线程来解决吗?我对多线程有点生疏,但如果它解决了我的问题,我会调查它。如果没有,那么我如何利用这两个接口,因为我能够并行接收/发送两个接口?

如果有人能提供帮助,我将不胜感激。

默认情况下,recv函数处于阻塞状态。这意味着该方法将停止控制流,直到在此套接字上收到某些内容。如果您呼叫sock1.recv()然后sock2.recv(),则只有在套接字 1 收到内容时才会到达第二个呼叫。

您可以使用 setblocking 方法使recv非阻塞,使其立即返回,即使没有要接收的内容。但是,您可能必须轮询两个套接字以获取要读取的新字节:

s1.setblocking(False)
s2.setblocking(False)
while True:
    # In non-blocking mode, recv throws a socket.error when
    # there is nothing to receive.
    try: a = s1.recv()
    except socket.error: a = None
    try: b = s2.recv()
    except socket.error: b = None
    handle_data(a,b) # Use received bytes at your discretion

您可以使用 multiprocessingthreading 模块并行化两个recv调用:

class SocketThread(threading.Thread):
    def run():
        while True:
            a = self.sock.recv() # This time, recv in blocking mode
            handle_data(a)
t1, t2 = SocketThread(), SocketThread()
t1.sock = sock1
t1.start()
t2.sock = sock2
t2.start()

最新更新