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

相關文章
相關標籤/搜索