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 );