http://www.cnblogs.com/huangyong9527/archive/2012/05/29/2523537.htmlhtml
Winsock2的其餘供應商不必定會實現AcceptEx函數。一樣狀況也包括的其餘Microsoft的特定APIs如TransmitFile,GetAcceptExSockAddrs以及其餘Microsoft將在之後版本的windows裏。編程
在運行WinNT和Win2000的系統上,這些APIs在Microsoft提供的DLL(mswsock.dll)裏實現,能夠經過連接mswsock.lib或者經過WSAioctl的SIO_GET_EXTENSION_FUNCTION_POINTER操做動態調用這些擴展APIs.windows
未獲取函數指針就調用函數(如直接鏈接mswsock.lib並直接調用AcceptEx)的消耗是很大的,由於AcceptEx 其實是存在於Winsock2結構體系以外的。每次應用程序常試在服務提供層上(mswsock之上)調用AcceptEx時,都要先經過WSAIoctl獲取該函數指針。若是要避免這個很影響性能的操做,應用程序最好是直接從服務提供層經過WSAIoctl先獲取這些APIs的指針。網絡
須要注意的是,經過WSAIoctl獲取AcceptEx函數指針時,只須要傳遞給WSAIoctl一個有效的SOCKET便可,該Socket的類型不會影響獲取的AcceptEx函數指針。函數
同理能夠獲取GetAcceptExSockaddrs函數指針性能
具體調用方式參看以下代碼(詳細參看《windows 網絡編程第二版》源碼第五章):ui
GUID guidAcceptEx = WSAID_ACCEPTEX,guidGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS;指針
LPFN_ACCEPTEX lpfnAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs;htm
DWORD bytes;blog
//加載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 );