select函式決定乙個或者多個套接字(socket)的狀態,如果需要的話,等待執行非同步i/o。
int select(
__in int nfds,
__inout fd_set *readfds,
__inout fd_set *writefds,
__inout fd_set *exceptfds,
__int const struct timeval *timeout
);
引數:
nfds:忽略。
readnfds: 指向檢查可讀性的套接字集合的可選的指標。
writefds: 指向檢查可寫性的套接字集合的可選的指標。
exceptfds: 指向檢查錯誤的套接字集合的可選的指標。
timeout: select函式需要等待的最長時間,需要以timeval結構體格式提供此引數,對於阻塞操作,此引數為null。
返回值:
select函式返回那些準備好並且包含在fd_set結構體的套接字的總數,如果超時,則返回0;如果錯誤發生,返回socket_error。如果返回值為socket_error,可以通過wsagetlasterror函式檢索指定的錯誤碼。
錯誤碼解釋
wsanotinitialisted
在使用此函式之前,wsastartup函式必須成功的執行
wsae****t
套接字執行時不能分配需要的資源或者readfds、writefds、exceptfds、timeval引數不是使用者位址空間的一部分。
wsaenetdown
網路子系統失敗
wsaeinval
超時值不合法的,或者其他的三個引數為空。
wsaeintr
阻塞的套接字1.1呼叫通過wsacancelblockingcall取消
wsaeinprogress
阻塞的套接字1.1呼叫正在處理或者服務提供者正在處理乙個掉使用者函式。
wsaenotsock
描述集中包括乙個不是套接字的入口。
說明引數
readfds
指示檢查套接字的可讀性。當套接字在
listen
狀態,如果已經接收乙個連線請求,這個套接字會被標記為可讀,例如乙個
accept
會確保不會阻塞的完成。對於其他的套接字,可讀性意味著佇列中的資料適合讀,當呼叫
recv,wsarecv,wsarecvfrom
或者recvfrom
後不會阻塞。
對於面向連線的套接字,可讀性也可以指示關閉套接字的從另一端接收的請求。如果虛電路正常關閉,並且所有的資料都已經接收,然後
recv
會立刻返回(沒有資料接收),如果虛電路重置,
recv
會立刻返回錯誤碼,例如
wsaeconnreset
。如果套接字選項
so_oobinline
置位(參見
setsockop
),出現的
oob資料將會被檢查。 引數
writefds
指示檢查套接字的可寫性。如果套接字處理
connect
呼叫(非阻塞的),並且完全建立連線,這時套接字是可寫。如果套接字沒有處理
connect
呼叫,可寫性意味著擔保
send,sendto
或者wsasendto
執行成功。但是,如果
len引數超過系統的快取空間大小,它們在阻塞套接字中是可以阻塞的。不確定多長的長度是合法的,尤其在多執行緒環境下。 引數
exceptfds
指示套接字被檢查
oob資料出現或者異常錯誤環境。
注意:oob資料僅僅應用當
so_oobinline
設定為false
的情況下。如果乙個套接字處理連線呼叫(非阻塞模式),試圖連線的錯誤資訊在
exceptfds
中,這個文件並沒有定義那些錯誤需要包含其中。
readfd,writefds或者
exceptfds
中任何兩個引數在呼叫的時候需要為
null
。至少乙個必須為非空,並且任何乙個非空描述設定必須包括至少乙個套接字控制代碼。
總之,乙個套接字將會被指定在乙個特殊的集合當
select
返回如果:
readfds:
①
如果listen
函式已經呼叫並且連線掛起,
accept
會執行成功。
②
資料適合讀(如果
so_oobinline
置位,包括
oob資料)
③
連線被關/重置
/終止writefds:
①
如果處理乙個
connect
呼叫(非阻塞),連線成功。
②
資料可以傳送。
exceptfds:
①
如果處理乙個
connect
呼叫(非阻塞),連線失敗。
②
oob資料適合讀(僅當
so_oobinline
未置位)
在標頭檔案
winsock2.h
中定義四個巨集來操作和檢查描述集。
fd_setsize
決定在描述集合中最大數量(
fd_setsize
的預設值為
64,此值可以在匯入
winsock2.h
之前通過
fd_setsize
修改)。
使用這些巨集是為了在不同的套接字環境中維護軟體便利。這些巨集操作和檢查
fd_set
內容為:
fd_clr(s,*set)
從set集合中移除描述符s
fd_isset(s,*set)
如果s在set中,返回非0,否則返回0
fd_set(s,*set)
增加描述符s到set中
fd_zero(*set)
初始化set集合為null集合
引數time-out控制select函式完成的時間(超過這個時間返回超時)。如果time-out是個空指標,select會一直保持阻塞指導至少乙個描述符符合指定的準則。否則,time-out指向乙個timeval結構體,這個結構體指定select在返回之前應該等待最大時間。當select返回,timeval結構體中的內容是不會改變的。如果timeval初始化為,select會立刻返回;這用於得到選擇的套接字的狀態。如果select立刻返回,然後select呼叫認為是非阻塞的,此時非阻塞呼叫的標準假設適用。例如,阻塞鉤子不會呼叫,窗體套接字不會退出。
原文:
c 中Socket通訊函式之select
select函式決定乙個或者多個套接字 socket 的狀態,如果需要的話,等待執行非同步i o。int select in int nfds,inout fd set readfds,inout fd set writefds,inout fd set exceptfds,int const st...
php實現共享記憶體程序通訊函式之 shm
前面介紹了php實現共享記憶體的乙個函式shmop,也應用到了專案中,不過shmop有侷限性,那就是只支援字串型別的 sem經過我的測試,是混合型,支援陣列型別,可以直接儲存,直接獲取,少了多餘的步驟格式轉換。不過sem有大小限制,shmop可以設定很大很大很大 不過也可以再php.ini修改相關配...
php實現共享記憶體程序通訊函式之 shm
前面介紹了php實現共享記憶體的乙個函式shmop,也應用到了專案中,不過shmop有侷限性,那就是只支援字串型別的 sem經過我的測試,是混合型,支援陣列型別,可以直接儲存,直接獲取,少了多餘的步驟格式轉換。不過sem有大小限制,shmop可以設定很大很大很大 不過也可以再php.ini修改相關配...