2012-11-22 57 views
1

我正在編寫一個需要網絡完全連接的點對點程序。但是,當我在本地測試並調出大約20個節點時,某些節點成功創建了一個到其他節點的套接字,但是在發生故障管道錯誤後立即寫入。這隻有當我開始所有的節點時纔會發生。如果我睡了一秒鐘,我沒有看到這個問題。管道破裂的原因

我有邏輯來處理兩個節點,這兩個節點都打開套接字eachother,這可能是越野車,但我確實看到它運行正常與較少的節點。這是本地測試的限制嗎?

+0

一個點對點的程序,連接需要形成一個完整的圖表嗎?我希望你打算這是一個修補器玩具 – goncalopp

+0

另外,當你創建「兩個節點都打開套接字到海誓山盟」,你是否確保你打開任何一個節點連接之前的偵聽套接字?正如你所提到的,你應該睡一會兒,直到所有的監聽套口打開爲止 – goncalopp

+0

我不是,但套接字正在創建,只是在寫入時拋出一個破損的管道異常。 – user490895

回答

2

「斷開的管道」表示您已寫入已由另一端關閉的連接。所以,你必須以某種方式做到這一點。

-1

當您嘗試寫入已在另一端關閉的管道時,會發生「斷管」錯誤。這可能,如果你正在運行一個腳本,這樣,如果你正在創建自己的插座進行處理編輯:

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('', 2020)) 


try: 
    s.recv(1024) 
except socket.error as e: 
    print e 
    print 

s.send('hello') 

此代碼工作正常,我對這種錯誤。由於斷開的管道可以被忽略,如果連接被客戶端重置/終止。

[Errno 104] Connection reset by peer 

Traceback (most recent call last): 
    File "./client1.py", line 17, in 
    s.send('hello') 
socket.error: [Errno 32] Broken pipe 
+0

在這種情況下,在recv()方法之後停止,而不是在發生任何可能的EOS或錯誤之後繼續執行send(),就好像它沒有發生一樣。 – EJP