首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python网络编程在Linux上同时使用两个网络接口的客户端?

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

Stack Overflow用户
提问于 2013-01-24 23:06:20
回答 1查看 278关注 0票数 0

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

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

所以我的问题是,延迟是由于使用recv()的“阻塞”特性造成的吗?另外,通过我的搜索,似乎有一些方法可以使该函数解锁?但我不确定该怎么做……这个问题会通过使用多线程来解决吗?我对多线程有点生疏,但如果它解决了我的问题,我会研究一下。如果不是,那么我如何利用这两个接口,因为我能够并行地从两个接口接收/发送?

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

EN

回答 1

Stack Overflow用户

发布于 2013-01-24 23:20:37

默认情况下,recv函数是阻塞的。这意味着该方法将暂停控制流,直到在此套接字上接收到某些内容。如果先调用sock1.recv(),然后调用sock2.recv(),则仅当套接字1接收到某些内容时才会到达第二个调用。

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

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14504445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档