未获取函数指针就调用函数(如直接连接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 套接口标志为非阻塞,且所需操作将产生阻塞。

使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针的更多相关文章

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

    Winsock2的其他供应商不一定会实现AcceptEx函数.同样情况也包括的其他Microsoft的特定APIs如TransmitFile,GetAcceptExSockAddrs以及其他Micro ...

  2. 使用WSAIoctl获取AcceptEx,Connectex,Getacceptexsockaddrs函数指针

    运行WinNT和Win2000的系统上,这些APIs在Microsoft提供的DLL(mswsock.dll)里实现,可以通过链接mswsock.lib或者通过WSAioctl的SIO_GET_EXT ...

  3. 获取VB类模块成员函数指针(转)

    最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...

  4. windows socket扩展函数

    1.AcceptEx() AcceptEx()用于异步接收连接,可以取得客户程序发送的第一块数据. BOOL AcceptEx( _In_  SOCKET       sListenSocket,   ...

  5. 比isConnected()更靠谱的的获取socket实时连接状态!

    看到这个标题,预计非常多人会说用socket.isConnected()或者socket.isClosed()等方法来推断即可了,但其实这些方法都是訪问socket在内存驻留的状态,当socket和s ...

  6. 自动获取socket链接状态

    C# TcpClient在连接成功后无法检测连接状态,即使对方关闭了网络连接.以下扩展可检测连接状态: static class TcpClientEx { public static bool Is ...

  7. Qt 使用 lambda 表达式做为槽函数时为什么使用 QObject::sender() 获取到的发送信号对象指针为空?

    /*! Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; ...

  8. MFC获取各个窗体(体)之间的指针(对象)

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  9. 通过网络socket获取对方 ip 和port

    int getpeername(int s, struct sockaddr *name, socklen_t *namelen);描述获取socket的对方地址struct sockaddr_in ...

随机推荐

  1. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  2. 转载:NPOI导出到Excel表格

    NPOI开发包下载:http://pan.baidu.com/share/link?shareid=4025220936&uk=2837994235 需要命名空间 using NPOI.HSS ...

  3. HDU 5273 Dylans loves sequence (逆序对,暴力)

    题意: 给定一个序列,对于q个询问:(L,R)之间有几个逆序对?序列元素个数上限1000,q上限10万.仅1测试例子. 思路: [L,R]的逆序对数量可以这么算,假设L<=K<R,将区间拆 ...

  4. HDU2102 A计划

    解题思路:一道简单题,却WA了十几发,犯几个低级错误.还是不能急躁,     内心要平静,具体分析见代码: #include<iostream> #include<cstdio> ...

  5. 几款免费的不用数据库的php的cms

    免费不用数据库的php的cms 下面的几种内容采集系统都是英文版的,全部不需使用数据库,都是国外的免费并且开源CMS.对中文支持如何,你自己试试吧! 1.MuCMS一个小型,平台独立的内容管理系统适用 ...

  6. vs2008破解方法

    前提条件:测试操作系统WIN7 1,解压缩镜像文件 2,找到文件:Setup\setup.sdb,用记事本打开: 3,找到以下项: [Product Key]XPWKC7X98VKQDGM3QWYVG ...

  7. 【转】PHP字符转义相关函数小结

    文章中有不正确的或者说辞不清的地方,麻烦大家指出了--- 与PHP字符串转义相关的配置和函数如下: 1.magic_quotes_runtime 2.magic_quotes_gpc 3.addsla ...

  8. 自己的一个LESS工具函数库

    自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...

  9. bsp tree

    http://www.cnblogs.com/dreams/archive/2007/03/25/687267.html http://blog.csdn.net/iduosi/article/det ...

  10. AE+C# 图层中增加相应属性标注

    原文 AE+C# 图层中增加相应属性标注 ) { IGeoFeatureLayer pGeoFeatureLayer; ILineLabelPosition pLineLabelPosition; I ...