回覆列表
  • 1 # 使用者2183744580897

    socket分為阻塞和非阻塞兩種,可以透過setsockopt,或者更簡單的setblocking, settimeout設定。阻塞式的socket的recv服從這樣的規則:當緩衝區內有資料時,立即返回所有的資料;當緩衝區內無資料時,阻塞直到緩衝區中有資料。非阻塞式的socket的recv服從的規則則是:當緩衝區內有資料時,立即返回所有的資料;當緩衝區內無資料時,產生EAGAIN的錯誤並返回(在Python中會丟擲一個異常)。兩種情況都不會返回空字串,返回空資料的結果是對方關閉了連線之後才會出現的。由於TCP的socket是一個流,因此是不存在“讀完了對方傳送來的資料”這件事的。你必須要每次讀到資料之後,根據資料本身來判斷當前需要等待的資料是否已經全部收到,來判斷是否進行下一個recv。可以看一下hiredis庫的介面設計,hiredis中的Reader有兩個介面,分別是feed和gets,feed每次送入一部分資料,不需要保證是正確分片的;gets則返回已經得到的完整的結果,如果返回False,表示已經沒有新的結果。基本上所有的TCP的socket程式設計都是遵循這樣的方法:讀入新資料;判斷有沒有完整的新訊息;處理新訊息,或者等待更多資料。

  • 中秋節和大豐收的關聯?
  • 常吃老譚酸菜泡麵是不是對身體不好?