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


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

  • 相关阅读:
    Leetcode
    算法
    手写代码注意点 -- HashMap
    Batch
    Batch
    Tomcat
    微服务
    Java 基础
    Maven
    算法
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/4096018.html
Copyright © 2020-2023  润新知