c 中Socket通訊函式之select

2021-06-06 06:30:42 字數 3683 閱讀 7313

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修改相關配...