Winsock2的其他供應商不一定會實現AcceptEx函數。同樣情況也包括的其他Microsoft的特定APIs如TransmitFile,GetAcceptExSockAddrs以及其他Microsoft將在以后版本的windows里。
在運行WinNT和Win2000的系統上,這些APIs在Microsoft提供的DLL(mswsock.dll)里實現,可以通過鏈接mswsock.lib或者通過WSAioctl的SIO_GET_EXTENSION_FUNCTION_POINTER操作動態調用這些擴展APIs.
未獲取函數指針就調用函數(如直接連接mswsock.lib並直接調用AcceptEx)的消耗是很大的,因為AcceptEx 實際上是存在於Winsock2結構體系之外的。每次應用程序常試在服務提供層上(mswsock之上)調用AcceptEx時,都要先通過WSAIoctl獲取該函數指針。如果要避免這個很影響性能的操作,應用程序最好是直接從服務提供層通過WSAIoctl先獲取這些APIs的指針。
需要注意的是,通過WSAIoctl獲取AcceptEx函數指針時,只需要傳遞給WSAIoctl一個有效的SOCKET即可,該Socket的類型不會影響獲取的AcceptEx函數指針。
同理可以獲取GetAcceptExSockaddrs函數指針
具體調用方式參看如下代碼(詳細參看《windows 網絡編程第二版》源碼第五章):
GUID guidAcceptEx = WSAID_ACCEPTEX,guidGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
LPFN_ACCEPTEX lpfnAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs;
DWORD bytes;
//加載AccpetEx函數指針
rc = WSAIoctl(
sockobj->s,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&guidAcceptEx,
sizeof(guidAcceptEx),
&lpfnAcceptEx,
sizeof(lpfnAcceptEx),
&bytes,
NULL,
NULL
);
//加載GetAcceptExSockaddrs函數指針
rc = WSAIoctl(
sockobj->s,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&guidGetAcceptExSockaddrs,
sizeof(guidGetAcceptExSockaddrs),
&lpfnGetAcceptExSockaddrs,
sizeof(lpfnGetAcceptExSockaddrs),
&bytes,
NULL,
NULL
);