运行WinNT和Win2000的系统上,这些APIs在Microsoft提供的DLL(mswsock.dll)里实现,可以通过链接mswsock.lib或者通过WSAioctl的SIO_GET_EXTENSION_FUNCTION_POINTER操作动态调用这些扩展APIs.

未获取函数指针就调用函数(如直接连接mswsock.lib并直接调用AcceptEx)的消耗是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的。每次应用程序常试在服务提供层上(mswsock之上)调用AcceptEx时,都要先通过WSAIoctl获取该函数指针。如果要避免这个很影响性能的操作,应用程序最好是直接从服务提供层通过WSAIoctl先获取这些APIs的指针。

需要注意的是,通过WSAIoctl获取AcceptEx函数指针时,只需要传递给WSAIoctl一个有效的SOCKET即可,该Socket的类型不会影响获取的AcceptEx函数指针。

同理可以获取Connectex与GetAcceptExSockaddrs函数指针。

代码如下:

typedef BOOL (WINAPI *AcceptExPtr)(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED);
typedef BOOL (WINAPI *ConnectExPtr)(SOCKET, const struct sockaddr *, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED);
typedef void (WINAPI *GetAcceptExSockaddrsPtr)(PVOID, DWORD, DWORD, DWORD, LPSOCKADDR *, LPINT, LPSOCKADDR *, LPINT); struct win32_extension_fns {
AcceptExPtr AcceptEx;
ConnectExPtr ConnectEx;
GetAcceptExSockaddrsPtr GetAcceptExSockaddrs;
}; #ifndef WSAID_ACCEPTEX
#define WSAID_ACCEPTEX \
{0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
#endif
#ifndef WSAID_CONNECTEX
#define WSAID_CONNECTEX \
{0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}
#endif
#ifndef WSAID_GETACCEPTEXSOCKADDRS
#define WSAID_GETACCEPTEXSOCKADDRS \
{0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
#endif void * get_extension_function(SOCKET s, const GUID *which_fn)
{
void *ptr = NULL;
DWORD bytes=0;
WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER,
(GUID*)which_fn, sizeof(*which_fn),
&ptr, sizeof(ptr),
&bytes, NULL, NULL); return ptr;
}

  调用:

const GUID acceptex = WSAID_ACCEPTEX;
const GUID connectex = WSAID_CONNECTEX;
const GUID getacceptexsockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
return;
ext->AcceptEx = (AcceptExPtr)get_extension_function(s, &acceptex);
ext->ConnectEx = (ConnectExPtr)get_extension_function(s, &connectex);
ext->GetAcceptExSockaddrs = (GetAcceptExSockaddrsPtr)get_extension_function(s,&getacceptexsockaddrs);
closesocket(s);

  

最新文章

  1. android adb 命令详解
  2. jQuery Ajax请求(关于火狐下SyntaxError: missing ] after element list ajax返回json,var json = eval("("+data+")"); 报错)
  3. Android Studio 一些使用经验
  4. uva 10090 Marbles
  5. UVA 10254 十八 The Priest Mathematician
  6. Nginx+tomcat 做负载均衡
  7. Linux内核学习笔记3——分段机制和分页机制
  8. 黑马程序员 Java正则表达式,详解反斜线在Java中的作用
  9. jquery去除字符串首尾空格的方法:$.trim()
  10. Orchard Module,Theme,Core扩展加载概述
  11. 性能调优之剖析OutOfMemoryError
  12. 个人练习:使用HTML+CSS3制作图片轮播功能(不使用JavaScript)
  13. 使用OneNote2016发送博客
  14. c++之__attribute__((unused))
  15. MySQL中的时态(日期/时间)数据类型
  16. winform,WPF 释放内存垃圾,减少资源占用方法
  17. ubuntu安装cocos2dx
  18. 一个站点配置多个App.config
  19. Oracle 11g
  20. 缓存MEMCACHE php调用

热门文章

  1. ansiblle---roles
  2. requests和BeautifulSoup模块的使用
  3. 对每个CheckBox的循环
  4. Java之分布式事务TCC
  5. 部署k8s时容器中ping不通
  6. Paper Mark
  7. Top 5 Business Messaging Announcements at Facebook F8 2019
  8. Java学习笔记-Java中的常用类
  9. linux学习命令收集
  10. 2019牛客暑期多校训练营(第八场)-A All-one Matrices (单调栈+前缀和)