使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针 - 冰花ぃ雪魄

zhaoxinshanwei 2021-08-29 原文


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


未获取函数指针就调用函数(如直接连接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);
就是这样。简述:控制一个套接口的模式。
  #include <winsock2.h>
  int WSAAPI WSAIoctl(SOCKET s, DWORD
  dwIoControlCode, LPVOID lpvInBuffer, DWORD
  cbInBuffer, LPVOID lpvOutBuffer, DWORD
  cbOutBuffer, LPDWORD lpcbBytesReturned,
  LPWSAOVERLAPPED lpOverlapped,
  LPWSAOVERLAPPED_COMPLETION_ROUTINE
  lpCompletionRoutine);
  s:一个套接口的句柄。
  dwIoControlCode:将进行的操作的控制代码。
  lpvInBuffer:输入缓冲区的地址。
  cbInBuffer:输入缓冲区的大小。
  lpvOutBuffer:输出缓冲区的地址。
  cbOutBuffer:输出缓冲区的大小。
  lpcbBytesReturned:输出实际字节数的地址。
  lpOverlapped:WSAOVERLAPPED结构的地址。
  lpCompletionRoutine:一个指向操作结束后调用的例程指针。
  返回值:
  调用成功后,WSAIoctl ()函数返回0。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
  错误代码:
  WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。
  WSAENETDOWN 网络子系统失效。
  WSAEINVAL cmd不是一个合法的命令;或者一个输入参数非法;或者命令对于该种类型的套接口不适用。
  WSAEINPROGRESS 在一个回调函数运行时调用了该函数。
  WSAENOTSOCK 描述字不是一个套接口。
  WSAEOPNOTSUPP 指定的ioctl命令无法实现,例如在SIO_SET_QOS或 SIO_SET_GROUP_QOS中指定的流描述无法实现。
  WSA_IO_PENDING 一个重叠操作被成功启动,过后将报告完成情况。
  WSAEWOULDBLOCK 套接口标志为非阻塞,且所需操作将产生阻塞。
posted on
2014-08-04 16:27 
冰花ぃ雪魄 
阅读(1051
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhaoxinshanwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhaoxinshanwei/p/3890437.html

使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针 - 冰花ぃ雪魄的更多相关文章

随机推荐

  1. 我的建站经历(教程)(二)

     转载自我的博客:https://blog.ljyngup.com 接 建站教程1 三、安装WordPress […]...

  2. BASH 学习笔记小结

    1. Linux 脚本编写基础  1.1 语法基本介绍  1.1.1 开头  程序必须以下面的行开始(必须方在 […]...

  3. Flink源码阅读(五)——Flink中任务相关的核心类简析

    0. 背景 本文基于Flink 1.12; 本文将沿着从程序开发到任务执行这条主线涉及到的核心类做简要解析; […]...

  4. 每个Web开发人员都应该知道的10个HTML5黑客

        HTML5是一种有吸引力的语言,适合初学者甚至是非编码人员使用。 面对现实吧,每当你与网站互动时,你都 […]...

  5. 面向对象是什么意思?通俗易懂

    举个最简单点的例子来区分 面向过程和面向对象 有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择 1、自己买材料, […]...

  6. table导出excel文件的几种方法

    总的来说,两种方法:服务器端生成和浏览器端生成。 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/ […]...

  7. Linux账号和密码文件 /etc/passwd和/etc/shadow

    Linux账号和密码文件 /etc/passwd和/etc/shadow Linux系统中,所有用户(包括系统 […]...

  8. 爬虫——综合案例流程版

    爬虫综合案例 开发步骤: 导入类库 创建爬虫通用类 初始化init方法 类中编写重试下载模块 类中编写真正下载 […]...

展开目录

目录导航