函式簡述
函式原型 SOCKET WSAAPI WSAAccept ( SOCKET s, struct sockaddr FAR * addr,
LPINT addrlen,
LPCONDITIONPROC lpfnCondition,
DWORD dwCallbackData
);
參數說明:
s:標識一個
套接口的描述字,該套接口在listen()後監聽連線。
addr:(可選)
指針,存放通訊層所知的連線實體地址的緩衝區的地址。addr參數的具體格式由
套接口創建時產生的地址族決定。
addrlen:(可選)
指針,存放addr地址長度的整形數的地址。
lpfnCondition:(可選的)用戶提供的條件函式的進程實例地址。該函式根據參數傳入的調用者信息作出接受或拒絕的決定,並通過給結果參數賦予特定的值來(可選地)創建和/或加入一個
套接口組。
dwCallbackData:作為條件函式參數返回給應用程式的回調數據。WinSock不分析該參數。
返回值:
若無錯誤發生,WSAAccept()函式返回所接受
套接口的描述字。否則的話,將返回INVALID_SOCKET錯誤,應用程式可通過WSAGetLastError()來獲取相應的
錯誤代碼。
addrlen參數引用的整形數初始時包含了addr參數所指向的空間數,在調用返回時包含了返回地址的實際長度。
附錄
這個WSAAccept函式提取第一個連線在佇列中等待將要連線的socket,並檢查它的條件函式,提供了指定條件函式(即非NULL)。如果條件函式返回CF_ACCEPT,WSAAccept創建一個新的套接字和執行任何套接字分組所顯示的結果參數g在條件函式中。新創建的套接字具有socket相同的屬性包括異步事件註冊WSAAsyncSelect或WSAEventSelect,但不包括監聽套接字的組ID。如果條件函式返回CF_REJECT,WSAAccept拒絕連線請求。條件函式運行在相同的執行緒作為該函式的功能,應儘快返回。條件函式應該返回 CF_DEFER表明沒有作出決定,沒有行動關於這個服務提供者連線請求。當應用程式準備採取行動在連線請求時,它將並返回再次調用WSAAccept CF_ACCEPT 或者 CF_REJECT作為條件函式的返回值。
一個套接字在默認模式(阻塞)會阻塞,直到連線存在,當一個應用程式調用WSAAccept和沒有連線上pendng佇列
一個套接字的非阻塞模式(阻塞)失敗與錯誤WSAEWOULDBLOCK當一個應用程式調用WSAAccept和沒有連線上pendng佇列。WSAAccept後成功,並返回一個新的套接字處理,接受插座不能用於接受任何更多的連線。原始套接字保持開放和監聽新的連線請求。
參數是一個結果的addr的參數填寫的地址連線實體,作為已知的通信層。的確切格式addr參數是由家庭地址的通信發生。這個addrlen是一個值的結果參數;它應該最初包含空格的數量由addr指出。在返回時,它將包含實際的長度(位元組)的地址返回。這個調用是使用面向連線的套接字類型如襪子流。如果addr和/或addrlen等於零,那么任何關於遠程地址返回接受套接字。否則,這兩個參數將被填滿,不管條件函式指定或返回內容。
A prototype of the condition function is as follows:
int CALLBACK ConditionFunc( IN LPWSABUF lpCallerId, IN LPWSABUF lpCallerData, IN OUT LPQOS lpSQOS, IN OUT LPQOSlpGQOS, IN LPWSABUF lpCalleeId, OUT LPWSABUF lpCalleeData, OUT GROUP FAR * g, IN DWORD dwCallbackData);
ConditionFunc是應用程式提供的回調函式的占位符。函式必須位於一個DLL或應用程式模組的實際情況。它是在模組定義檔案中導出。 UseMakeProcInstance一個過程實例的回調函式的地址。
lpCallerId參數是一個值,該值的參數,該參數包含連線實體的地址。的lpCallerData是一個數值參數,包含任何用戶數據。這些參數中的信息一起被傳送的連線請求。如果無來電顯示識別主叫方數據是可用的,相應的參數為NULL。許多網路協定不支持連線時的主叫方數據。大多數傳統的網路協定可以預計到支持主叫方ID信息,在連線請求的時間。 lpCallerId點的buf所指向的WSABUF部分一個SOCKADDR。根據它的地址族(通常由鑄造的的SOCKADDR一些類型特定的地址族)的的SOCKADDR的解釋。
lpSQOS參數的引用FLOWSPEC的結構為插座指定的來電,為每個方向之一,任何額外的供應商特定的參數。適用於任何單向插座的傳送或接收流規範值將被忽略。一個NULL值表明,有沒有調用者提供QOS和,沒有談判是可能的。一個非NULL lpSQOS的指針指示的QoS協商是發生或供應商沒有談判,準備接受QOS要求。
lpGQOS參數(保留以供將來使用插座組)引用的FLOWSPEC的結構套接字組的調用者創建,為每個方向之一,任何額外的供應商特定的參數。 lpGQOS一個NULL值表示無來電顯示提供的服務質量。如果協商是發生的服務質量信息可以被返回。
lpCalleeId是一個值參數,包含本地地址,所連線的實體。 lpCalleeId點的buf所指向的WSABUF部分一個SOCKADDR。根據它的地址族(通常由鑄造的的SOCKADDR一些類型特定的地址族)的的SOCKADDR被解釋。
lpCalleeData是一個結果參數,用於為所使用的條件的函式來提供用戶數據返回到連線的實體。最初的lpCalleeData-> len個包含由服務提供商分配的緩衝區,並指出,通過lpCalleeData - >緩衝區的長度。通過用戶數據返回給調用者的值為零,則表示不支持。條件函式複製到lpCalleeData-> len個位元組的數據到lpCalleeData - >緩衝區,然後更新lpCalleeData-> len個顯示實際傳輸的位元組數。如果沒有用戶數據將被傳遞迴給調用者,條件函式應設定lpCalleeData的 - > len個零。所有的地址和用戶數據的格式的特定套接字所屬的地址族。
保留供未來使用插座組:分配的結果參數g在條件函式來表示以下操作:
1、若果&g是一個現有的插座組ID,加s到該組,本組所設定的所有要求得到滿足;
2、如果&g = SG_UNCONSTRAINED_GROUP的,創建一個無約束的插座組,有S的第一個成員;
3、如果&g = SG_CONSTRAINED_GROUP的,創建一個受限的插座組,有S的第一個成員;
4、如果&g =零,沒有組進行操作。
對於無約束的群體,任何一組插槽可以組合在一起,只要他們支持由一個單一的服務提供商。可以由一個有限的插座組僅面向連線的套接字,並要求所有組合插座上的連線到相同的地址在同一主機上。對於新創建的套接字組,新的組ID可以檢索利用getsockopt選項SO_GROUP_ID,如果此操作成功完成。一個插座組及其相關聯的ID仍然有效,直到最後一個套接字被關閉屬於該插座組。插座組ID是唯一的,對於一個給定的服務供應商的所有進程。
dwCallbackData參數值傳遞的條件功能的dwCallbackData在原來的WSAAccept調用的參數傳遞的值。這個值被解釋只能由Windows套接字第2版客戶端。這允許客戶端通過一些WSAAccept調用網站的條件函式的上下文信息。這也提供了與任何所需的附加信息,以確定是否接受的連線或沒有的功能的條件。一個典型的用法是通過適當投指針的數據結構,它包含與此套接字關聯的應用程式定義的對象的引用。
錯誤代碼
WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAECONNREFUSED 根據條件函式的返回值(CF_REJECT)強制拒絕連線請求。
WSAENETDOWN 網路子系統失效。
WSAEFAULT addrlen參數太小(小於sockaddr結構的大小),或者lpfnCondition並不是
用戶空間的一部分。
WSAEINTR 通過WSACancelBlockingCall()函式取消(阻塞)調用。
WSAEINPROGRESS 一個阻塞WinSock調用正在進行。
WSAEINVAL WSAAccept()調用前未執行listen()調用;條件函式中的g
參數非法;條件函式的返回值非法;
套接口處於非法狀態。
WSAEMFILE WSAAccept()調用時排隊佇列非空,且無可用
套接口描述字。
WSAENOBUFS 無可用緩衝區空間。
WSATRY_AGAIN 根據條件函式的返回值(CF_DEFER) ,連線請求被推遲。
WSAEWOULDBLOCK
套接口標誌為非阻塞,無連線請求供接受。
WSAEACCES 被推遲的連線請求逾時或撤銷。
另請參閱:accept(), bind(), connect(), getsockopt(),listen(), select(), socket(), SAAsyncSelect(), WSAConnect().