2013-01-24 29 views
0

目前我的客戶端上有兩個網絡接口。我創建了兩個獨立的套接字,它們綁定到每個接口ip。現在我也有兩臺服務器,每臺服務器與客戶端上的一個套接字進行通信。我希望能夠同時從兩個接口(目前使用UDP或DGRAMS)接收數據(現在〜10MB,但稍後會更大),但由於某些原因,總會有延遲,因爲它必須完成一個數據傳輸套接字,然後開始在另一個套接字上傳輸。Linux上的Python網絡編程 - 在客戶端同時使用兩個網絡接口?

我已經確認綁定每個接口是成功的,我可以在每個套接字上與其各自的服務器進行通信。目前,我只是在相同的代碼塊中執行s1.recv()s2.recv()

所以我的問題是,是由於使用recv()「阻塞」功能的延遲?同樣通過我的搜索,似乎有辦法讓函數暢通無阻?但我不確定如何去做這件事......而這會通過使用多線程來解決嗎?我多線程有點生疏,但如果它解決了我的問題,我會研究它。如果沒有,那麼我怎麼能夠利用這兩個接口,我能夠從兩個接口並行接收/發送?

如果有人可以協助,我將不勝感激。

回答

1

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調用,即使用multiprocessingthreading模塊:

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() 
+0

你忘了提扭曲,這將爲你做這個難題。 :) –

+0

我不知道扭曲,但它看起來很有趣。謝謝你的提示! :) – helmbert