日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WSAAccept()函数使用解析

發布時間:2024/4/11 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WSAAccept()函数使用解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先了解accept、AcceptEx、WSAAccept的區別?.

1.?acceptWSAAccept是同步操作,AcceptEx是異步操作

2.?WSAAccept函數早accept函數基礎上添加了條件函數判斷是否接受客戶端連接

3.?AcceptEx是異步的,可以同時發出多個AcceptEx請求,支持重疊IO操作.


?WSAAccept()函數:

簡述:?有條件地接受一個連接基于狀態函數的返回值,選擇創建或加入一個套接字組,提供QOS?flowspecs,允許連接數據的轉移。?

函數原型

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相同的屬性包括異步事件注冊WSAAsyncSelectWSAEventSelect,但不包括監聽套接字的組ID。如果條件函數返回CF_REJECT,WSAAccept拒絕連接請求。條件函數運行在相同的線程作為該函數的功能,應盡快返回。條件函數應該返回?CF_DEFER表明沒有作出決定,沒有行動關于這個服務提供者連接請求。當應用程序準備采取行動在連接請求時,它將并返回再次調用WSAAccept?CF_ACCEPT?或者?CF_REJECT作為條件函數的返回值。?一個套接字在默認模式(阻塞)會阻塞,直到連接存在,當一個應用程序調用WSAAccept和沒有連接上pendng隊列?一個套接字的非阻塞模式(阻塞)失敗與錯誤WSAEWOULDBLOCK當一個應用程序調用WSAAccept和沒有連接上pendng隊列。WSAAccept后成功,并返回一個新的套接字處理,接受插座不能用于接受任何更多的連接。原始套接字保持開放和監聽新的連接請求。?參數是一個結果的addr的參數填寫的地址連接實體,作為已知的通信層。的確切格式addr參數是由家庭地址的通信發生。這個addrlen是一個值的結果參數;它應該最初包含空格的數量由addr指出。在返回時,它將包含實際的長度(字節)的地址返回。這個調用是使用面向連接的套接字類型如襪子流。如果addr/addrlen等于零,那么任何關于遠程地址返回接受套接字。否則,這兩個參數將被填滿,不管條件函數指定或返回內容。?

一個條件函數的原型如下:?

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?無可用緩沖區空間。?

WSAENOTSOCK?描述字不是一個套接口。?

WSAEOPNOTSUPP?所引用的套接口不是支持面向連接服務類型的。?WSATRY_AGAIN?根據條件函數的返回值(CF_DEFER)?,連接請求被推遲。?

WSAEWOULDBLOCK?套接口標志為非阻塞,無連接請求供接受。?

WSAEACCES?被推遲的連接請求超時或撤銷。?另請參閱:accept(),?bind(),?connect(),?getsockopt(),listen(),?select(),?socket(),?SAAsyncSelect(),?WSAConnect().

總結

以上是生活随笔為你收集整理的WSAAccept()函数使用解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。