zoukankan      html  css  js  c++  java
  • 使用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 套接口标志为非阻塞,且所需操作将产生阻塞。
  • 相关阅读:
    Java读写锁(ReentrantReadWriteLock)学习
    水平拆分和垂直拆分理解(未完)
    MySQL 主从复制
    sharding-JDBC 实现读写分离
    Linux查看程序端口占用情况
    sharding-jdbc 实现分表
    MySQL explain
    MySQL的七种join
    MySQL建立高性能索引策略
    Nginx企业级优化
  • 原文地址:https://www.cnblogs.com/zhaoxinshanwei/p/3890437.html
Copyright © 2011-2022 走看看