select()

in t n fd_set

簡述

確定一個或多個套接口的狀態,如需要則等待
#include <winsock.h>
int PASCAL FAR select( int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds, const struct timeval FAR* timeout); 
nfds:是一個整數值,是指集合中所有檔案描述符的範圍,即所有檔案描述符的最大值加1,不能錯!在Windows中這個參數的值無所謂,可以設定不正確。
readfds:(可選)指針,指向一組等待可讀性檢查的套接口
writefds:(可選)指針,指向一組等待可寫性檢查的套接口。
exceptfds:(可選)指針,指向一組等待錯誤檢查的套接口。
timeout:select()最多等待時間,對阻塞操作則為NULL。

注釋

函式用於確定一個或多個套接口的狀態。對每一個套接口,調用者可查詢它的可讀性、可寫性及錯誤狀態信息。用fd_set結構來表示一組等待檢查的套接口。在調用返回時,這個結構存有滿足一定條件的套接口組的子集,並且select()返回滿足條件的套接口的數目。有一組宏可用於對fd_set的操作,這些宏與Berkeley Unix軟體中的兼容,但內部的表達是完全不同的。
readfds參數標識等待可讀性檢查的套接口。如果該套接口正處於監聽listen()狀態,則若有連線請求到達,該套接口便被標識為可讀,這樣一個accept()調用保證可以無阻塞完成。對其他套接口而言,可讀性意味著有排隊數據供讀取。或者對於SOCK_STREAM類型套接口來說,相對於該套接口的虛套接口已關閉,於是recv或recvfrom操作均能無阻塞完成。如果虛電路被中止,則recv()不讀取數據立即返回;如果虛電路被強制復位,則recv將以WSAECONNRESET錯誤立即返回。如果SO_OOBINLINE選項被設定,則將檢查帶外數據是否存在(參見setsockopt())。 writefds參數標識等待可寫性檢查的套接口。如果一個套接口正在connect()連線(非阻塞),可寫性意味著連線順利建立。如果套接口並未處於connect()調用中,可寫性意味著send和sendto調用將無阻塞完成。〔但並未指出這個保證在多長時間內有效,特別是在多執行緒環境中〕。
exceptfds參數標識等待帶外數據存在性或意味錯誤條件檢查的套接口。請注意如果設定了SO_OOBINLINE選項為假FALSE,則只能用這種方法來檢查帶外數據的存在與否。對於SO_STREAM類型套接口,遠端造成的連線中止和KEEPALIVE錯誤都將被作為意味出錯。如果套接口正在進行連線connect()(非阻塞方式),則連線試圖的失敗將會表現在exceptfds參數中。
如果對readfds、writefds或exceptfds中任一個組類不感興趣,可將它置為空NULL。
winsock.h頭檔案中共定義了四個宏來操作描述字集。FD_SETSIZE變數用於確定一個集合中最多有多少描述字(FD_SETSIZE預設值為64,可在包含winsock.h前用#define FD_SETSIZE來改變該值)。對於內部表示,fd_set被表示成一個套接口的佇列,最後一個有效元素的後續元素為INVAL_SOCKET。宏為: FD_CLR(s,*set):從集合set中刪除描述字s。
FD_ISSET(s,*set):若s為集合中一員,非零;否則為零。 FD_SET(s,*set):向集合添加描述字s。 FD_ZERO(*set):將set初始化為空集NULL。 timeout參數控制select完成的時間。若timeout參數為空指針,則select將一直阻塞到有一個描述字滿足條件。否則的話,timeout指向一個timeval結構,其中指定了select調用在返回前等待多長時間。如果timeval為{0,0},則select立即返回,這可用於探詢所選套接口的狀態。如果處於這種狀態,則select調用可認為是非阻塞的,且一切適用於非阻塞調用的假設都適用於它。舉例來說,阻塞鉤子函式不應被調用,且WINDOWS套接口實現不應yield。

返回值

select()調用返回處於就緒狀態並且已經包含在fd_set結構中的描述字總數;如果逾時則返回0;否則的話,返回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError獲取相應錯誤代碼
當返回位-1時,所有描述符集清0。
當返回為0時,逾時不修改任何描述符集。
當返回為非0時,在3個描述符集裡,依舊是1的位就是準備好的描述符。這也就是為什麼,每次用select後都要用FD_ISSET的原因。

錯誤代碼

WSANOTINITIALISED:在使用此API之前應首先成功地調用WSAStartup()。WSAENETDOWN:WINDOWS套接口實現檢測到網路子系統失效。WSAEINVAL:逾時時間值非法。WSAEINTR:通過一個WSACancelBlockingCall()來取消一個(阻塞的)調用。WSAEINPROGRESS:一個阻塞的WINDOWS套接口調用正在運行中。WSAENOTSOCK:描述字集合中包含有非套接口的元素。

調用

使用"select()+from"的語句,從網頁中調用資料庫檔案,如從資料庫中的某一張數據表中調用一列數據,select(表列)from(表) 。是常用的SQL語句,用於SQL數據查詢,但也用於動態網頁調用數據表,以實現網頁互動的功能。

相關參考

WSAAsyncSelect(), accept(), connect(), recv(), recvfrom(), send()。

jQuery中事件用法

概述

觸發每一個匹配元素的select事件
這個函式會調用執行綁定到select事件的所有函式,包括瀏覽器的默認行為。可以通過在某個綁定的函式中返回false來防止觸發瀏覽器的默認行為。

返回值

jQuery

示例

觸發所有input元素的select事件:
jQuery 代碼:
$("input").select();

相關詞條

相關搜尋

熱門詞條

聯絡我們