2015-06-18 54 views
0

從讀取asyncoredocumentation,似乎handle_connect()應成功連接到偵聽套接字後調用,即TCP握手完成後應調用。但在實踐中,看起來asyncore不運行handle_connect(),除非它在套接字上接收或發送數據包。Asyncore未運行handle_connect()

舉個例子:

我有服務器套接字綁定和監聽某個端口上。套接字將接受任何傳入的連接,打印接收到的內容,併發回「謝謝」。

然後我開始一個asyncore.dispatcher基於客戶端,創建時誰連接到服務器套接字。客戶端有一個方法handle_connect()向服務器發送「hello」數據包。它還具有打印接收到的數據包的方法讀取。 (在這種情況下,它應該打印「謝謝」)

當這個客戶端運行時,連接被創建,TCP握手成功,服務器能夠接受連接,但沒有其他事情發生。永遠不會調用handle_connect()

使異步運行handle_connect()的唯一方法是如果服務器通過發送數據包開始,或者如果我發送數據包到服務器的__init()__函數。然後handle_connect()工程,一切工作正常。

這是事情應該如何工作?如果是這樣,爲什麼?或者這只是一個錯誤,因爲asyncore被寫入而沒有更正?

有沒有其他辦法可以解決這個問題?

回答

0

不爲sock.connect的方法,但可以用來捕捉socket.error例外:

def handle_error(self): 
    t, v, tb = sys.exc_info() 
    if t == socket.error: 
     print("Connect error") 
0

handle_connect可能不會因爲在你的init方法要求你可能已經稱爲setblocking()函數的派生類1.連接將在初始設置內建立,handle_connect永遠不會被調用。

如果不是這種情況,那麼讀取方法返回false和handle_connect犯規被調用。

0

我剛剛遇到了同樣的問題與Python 3.在部分/全部(不記得確切的細節現在)系統,建立連接時,「套接字寫就緒」事件通知。因此,如果您的調度程序的writeable()方法在套接字連接之前返回False,asyncore模塊中的功能將永遠不會檢查套接字是否變爲「可寫入」,永遠不會檢測到連接建立,並且方法永遠不會調用。

我固定它通過以下方式:

def writable(self): 
    if not self.connected: 
     return True 
    # ... your logic goes here