2 回答

TA貢獻1860條經驗 獲得超8個贊
您的代碼存在三個主要問題:
您
input
在循環中調用。該功能將被阻止直到ENTER被按下。如果從控制臺輸入非整數,則將出現異常。您可以處理該異常,但是會錯誤地處理它。取而代之或再次要求輸入,您只需嘗試執行相同的操作即可再次導致異常。
您僅在
select
呼叫中檢查傳入連接。您永遠不會檢查任何連接的插座是否發送了任何東西。
對您來說,主要的問題是調用,input
因為它將完全停止您的程序,直到輸入來自控制臺的輸入為止。

TA貢獻1886條經驗 獲得超2個贊
您的帖子不清楚,但是我可以告訴您問題是您不知道如何使用select
。
您僅張貼呼叫的代碼選擇一次。程序進入select()
調用并等待mainConnection
可讀(或超時)。如果mainConnection
在超時之前變得可讀,則select()
返回一個可讀文件描述符,然后在for
循環中對其進行處理。就是這樣。select
再也不會被調用,因此您的程序再也不會檢查任何傳入的連接了。
在幾乎每個應用程序中select
都應該處于循環狀態。每次循環時,程序都會在select()
調用中等待,直到一個或多個套接字準備好進行讀取或寫入。發生這種情況時,select
為您提供準備好的文件描述符,讓其他代碼實際執行某項工作是您的工作。例如,如果select
返回可讀的套接字文件描述符,則.recv()
在該套接字上調用是您的工作。
您當然可以使用asyncore。實際上,我認為您應該研究asyncore的源代碼以學習如何正確使用select
。
添加回答
舉報