未获取函数指针就调用函数(如直接连接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. 移植yaffs文件系统

    需要下载yaffs2-d43e901.tar.gz,busybox-1.13.0.tar.bz2 使用的交叉编译器是4.33 1.修改配置编译busybox 修改Makefile CROSS_COMP ...

  2. ecshop 文章列表页调用描述信息啊

    1.打开 includes/lib_article.php文件 将 $sql = 'SELECT article_id, title, author, add_time, file_url, open ...

  3. 【英语】Bingo口语笔记(41) - 有关爱情的表达

  4. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  5. OpenLayers调用arcgis server发布的地图服务

    有两种方式可以调用arcgis server发布的地图服务,一种是rest,一种是wms.  地图的投影为900913,arcgis server为10.0版本,地图服务的空间参考为3857.   与 ...

  6. js函数内嵌函数的整体跳出 .

    stop=false; $.ajax({success:function(){ 这里面不能用return false跳出整个<script></script>,只能跳出该处的f ...

  7. invalid initialization of non-const reference of type与discards qualifiers

    参数传递          函数参数的传递是初始化语义:用调用者的实参去初始化函数的形参,如果参数是对象,需要调用该类的拷贝构造函数,如果没有显式定义的拷贝构造函数,则执行默认的按成员拷贝      ...

  8. [Everyday Mathematics]20150228

    试证: $$\bex \int_0^\infty \sin\sex{x^3+\frac{\pi}{4}}\rd x =\frac{\sqrt{6}+\sqrt{2}}{4}\int_0^\infty ...

  9. LruCache--远程图片获取与本地缓存

    Class Overview A cache that holds strong references to a limited number of values. Each time a value ...

  10. INDEX_JOIN

    这里就以INDEX_JOIN为例,简单描述一下如何影响Oracle的执行计划的产生. 控制执行计划最简单的方法莫过于使用HINT,这篇文章要介绍的是,在不使用HINT的情况下,让Oracle产生IND ...