Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux上的Python网络编程-在客户端同时使用两个网络接口?_Python_Networking_Interface - Fatal编程技术网

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

Linux上的Python网络编程-在客户端同时使用两个网络接口?,python,networking,interface,Python,Networking,Interface,目前,我的客户端上有两个网络接口。我创建了两个单独的套接字,它们绑定到每个接口ip。现在我还有两台服务器,每台服务器与客户端上的一个套接字通信。我希望能够同时从两个接口(目前使用UDP或DGRAMS)接收数据(目前约10MB,但以后会更大),但由于某些原因,总是会有延迟,因为它必须在一个套接字上完成数据传输,然后才能在另一个套接字上开始传输 我已经确认绑定每个接口是成功的,并且我能够在每个套接字上与其各自的服务器进行通信。目前,我只是在同一代码块中执行s1.recv()和s2.recv() 所以

目前,我的客户端上有两个网络接口。我创建了两个单独的套接字,它们绑定到每个接口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
您可以使用或模块并行化两个
recv
调用:


你忘了提到Twisted,这对你来说很难我不知道Twisted,但它看起来很有趣。谢谢你的提示!:)
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()