使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针

来源:互联网 发布:上海华讯网络笔试 编辑:程序博客网 时间:2024/06/07 01:12
未获取函数指针就调用函数(如直接连接mswsock.lib并直接调用AcceptEx)的消耗是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的。每次应用程序常试在服务提供层上(mswsock之上)调用AcceptEx时,都要先通过WSAIoctl获取该函数指针。如果要避免这个很影响性能的操作,应用程序最好是直接从服务提供层通过WSAIoctl先获取这些APIs的指针。
通过WSAIoctl获取AcceptEx函数指针时,只需要传递给WSAIoctl一个有效的SOCKET即可,该Socket的类型不会影响获取的AcceptEx函数指针,同理,其他的各种以EX后缀的扩展函数都可以这样使用了。
 
 我先声明了:
LPFN_ACCEPTEX       lpAcceptEx;其他需要的参数我就略过去了
 然后
 DWORD nRet = WSAIoctl(                //此函数主要是用在 '改变套接字的模式' 上        m_listen_socket,            SIO_GET_EXTENSION_FUNCTION_POINTER,    //第二个参数决定了WSAIoctl的不同用途        &g_GUIDAcceptEx,            sizeof(g_GUIDAcceptEx),            &lpAcceptEx,       //作为输出缓冲区,以后就可以作为调用AcceptEx的指针          sizeof(lpAcceptEx),           &dwRet,NULL,NULL);
 nRet!=0.那么获取顺利,下一步,
 int bRet = lpAcceptEx(            //调用指针已可以使用            m_listen_socket,               lp_io->socket,           //单IO数据结构
            lp_io->buf,               0,                     //该参数为0,函数接到连接后立即返回,不会接收数据            sizeof(SOCKADDR_IN) + 16,               sizeof(SOCKADDR_IN) + 16,               &dwBytes,&lp_io->ol);
就是这样。
原创粉丝点击