使用WSAIoctl获取AcceptEx函数指针 [转]

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

相关文章
相关标签/搜索