2010-11-22 26 views
1

根據我對select()所有文檔的理解,似乎可以使用write fd_set來檢查套接字(描述符)的可用性,以便可以使用檢測一個成功的非阻塞connect()嘗試,但我沒有得到的是什麼時候套接字在成功connect()accept()之後變得不可用? 而這在理論上是否意味着插座始終可用於send() ing?select的概念fd_set

作爲最後一個問題,爲整個會話的寫入操作保留連接的套接字是否可行?

謝謝。

回答

3

無法寫入套接字的最常見情況是當連接經過相對較慢的網絡鏈接時,應用程序可能會飽和。操作系統將緩衝有限的數據量,因此在發送更多數據之前,您的應用程序必須通過檢查套接字是否可用(表示某些數據已發送且緩衝區有空閒空間)來限制自己。至於你的其他問題,如果你有一個單線程使用的任何類型的多個套接字,例如,一個Web服務器,使用select()來有效地管理它們當然是有意義的。

1

使用非阻塞套接字時,任何操作都可能因WSAEWOULDBLOCK錯誤而失敗。在connect()和send()的情況下,可以使用select()來確定掛起的connect()調用何時成功連接到服務器,或者套接字是否可寫,以便它可以在不阻塞的情況下接受新數據。

1

'可用於發送'只意味着在套接字的發送緩衝區中有空間。大多數情況下都是如此,從連接完成並分配緩衝區開始。只有當緩衝區填滿時纔會發生這種情況,而這種情況只有在目標套接字的接收緩衝區填滿時纔會發生,只有當閱讀應用程序比寫入程序慢時纔會發生。

+0

目標套接字的接收緩衝區可能未滿。它可能只是一個緩慢的網絡連接。 – mark4o 2010-11-26 00:14:56