您的位置:首页 > 大数据 > 人工智能

WSAIoctl 的SIO_GET_EXTENSION_FUNCTION_POINTER用法

2015-08-18 16:33 896 查看
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

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: