AcceptEx浅析

AcceptEx浅析AcceptEx函数的定义如下:BOOLAcceptEx(  SOCKETsListenSocket,       SOCKETsAcceptSocket,       PVOIDlpOutputBuffer,       DWORDdwReceiveDataLength,   DWORDdwLocalAddressLength,   DW

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

AcceptEx函数的定义如下:

BOOL AcceptEx ( 
  SOCKET sListenSocket,      
  SOCKET sAcceptSocket,      
  PVOID lpOutputBuffer,      
  DWORD dwReceiveDataLength,  
  DWORD dwLocalAddressLength,  
  DWORD dwRemoteAddressLength,  
  LPDWORD lpdwBytesReceived,  
  LPOVERLAPPED lpOverlapped  
);

参数1–sListenSocket, accept前绑定到本地地址的监听socket,一般由listen()得到
参数2–sAcceptSocket, 用于接受连接的socket,本人理解应该更主要是的一个out参数。
参数3–lpOutputBuffer,一块内存,当Accept成功时,会有本地(server)的地址信息,
       远端地址信息(client),可能还有数据(当dwReceiveDataLength!=0时)将得到。此参数将存放这
 3种信息,其中,它们是这样存放的:开始dwReceiveDataLength个大小,用于存放Accept时接到
 到的数据,后面接着存放server的地址,接着是client的地址信息。该参数比较重要,如果使用
 不当,可能会引起内存溢出。
参数4–dwReceiveDataLength,lpOutputBuffer中用于存放数据的空间大小。如果此参数=0,则Accept时
 将不会待数据到来,而直接返回,所以通常当Accept有数据时,该参数设成为:
 sizeof(lpOutputBuffer)(实参的实际空间大小) – 2*(sizeof sockaddr_in +16)。

参数5–dwLocalAddressLength,存放本地址地址信息的空间大小
参数6–dwRemoteAddressLength,存放本远端地址信息的空间大小
参数7–lpdwBytesReceived,out参数,用于存放接收到的数据长度。该参数只是在同步IO的时候会有效
 返回,如果是异步的重叠IO,需从完成通知信息里面得到。(详见MSDN)
参数8–lpOverlapped,标识异步操作时的重叠IO结构信息。

 

摘自:http://www.cnblogs.com/shine1592/archive/2008/10/23/1317695.html

 

使用此函数时,要包含头文:Mswsock.h,同时要链接:Mswsock.lib。可在源程序中加入下面的语句,这样在编译时,将自动链接Mswsock.lib。

  #pragma comment(lib,” Mswsock.lib”)
  

  下面是使用AcceptEx函数的示例代码:

  #define STRICT

  #define _WIN32_WINNT 0x0500 // Windows 2000 or later

  #define WIN32_LEAN_AND_MEAN

  
  #include

  #include

  #include

  
  #pragma comment(lib,”Ws2_32.lib”)

  #pragma comment(lib,”Mswsock.lib”)
  int main()

  {

  const int BUFSIZE = 48;

  LPFN_ACCEPTEX lpfnAcceptEx = NULL;

  GUID GuidAcceptEx = WSAID_ACCEPTEX;

  DWORD dwBytes = 0;

  SOCKET ListenSocket = INVALID_SOCKET;

  SOCKET ClientSocket = INVALID_SOCKET;

  HANDLE hCompPort = INVALID_HANDLE_VALUE;

  OVERLAPPED ol;

  char buf[BUFSIZE];

  
  // Init WinSock Lib ….
  

  ListenSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX, NULL, 0, WSA_FLAG_OVERLAPPED);

  ClientSocket = WSASocket(AF_IPX, SOCK_STREAM, NSPROTO_SPX, NULL, 0, WSA_FLAG_OVERLAPPED);
  

  // Bind && Listen ….

  
  // Associate the listening socket with the completion port

  CreateIoCompletionPort((HANDLE)ListenSocket, hCompPort, (u_long)0, 0);
 
  
  // Get AccpetEx Function

  WSAIoctl(ListenSocket,

  SIO_GET_EXTENSION_FUNCTION_POINTER,

  &GuidAcceptEx,

  sizeof(GuidAcceptEx),

  &lpfnAcceptEx,

  sizeof(m_WorkInfo.AcceptInfo.lpfnAcceptEx),

  &dwBytes,

  NULL,

  NULL

  );

  
  ZeroMemory(buf,BUFSIZE);

  ZeroMemory(&ol,sizeof(OVERLAPPED));
  // Post Accept Message

  lpfnAcceptEx(ListenSocket,

  ClientSocket,

  buf,

  0,

  sizeof(SOCKADDR_IN) + 16,

  sizeof(SOCKADDR_IN) + 16,

  &dwBytes,

  &ol

  );

  }

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

  如果不希望AcceptEx建立连接后等待用户发送数据,那么必须将第四个参数设为0。第5、6参数必须是对应SOCKET的地址类型的大小再加上16个字节。

  为了使服务器能较好的处理用户连接请求,可采取如下两种策略:

  A.设定两个界限值,使系统未处理的Accept操作保持在一个固定水平。推荐上限为10;

  B.通过WSAEventSelect函数监听ListenSocket上的FD_ACCEPT事件。

  当关闭完成端口时,如果还有未处理的Accepte操作,应该先关闭ListenSocket,然后在IOCP中,处理这些Accept操作(进行资源释放等),切记不要强行终止那些没有处理的Accept操作,否则会造成内存泄漏。
  
  为防止恶意用户(建立连接后,不发送数据),可设置ListenSocket的SO_CONNECT_TIME属性。
  
  如果希望ClientSocket具有和ListenSocket相同的属性,需要对ClientSocket调用SO_UPDATE_ACCEPT_CONTEXT。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Civet148/archive/2006/06/03/771954.aspx

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187787.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • winrar下载_标致408后尾晃完美解决方案

    winrar下载_标致408后尾晃完美解决方案本文参考撸Linux的文章https://www.lulinux.com/archives/13192018年wineQQ最完美解决方案(多Linux发行版通过测试并稳定运行)腾讯官方早就在10年代初就停止运营Linux版QQ,然而民间折腾Linux版QQ的脚步从来没停过。时至今日,它总算有了完美无暇的方案——deepinwine系列。要感谢deepin公司的最大努力。也…

    2022年9月5日
  • Lunix操作「建议收藏」

    Lunix操作「建议收藏」pwd当前目录ls显示文件ls-a显示所有文件wenjianls-a~显示所有隐藏文件权限 用户所有者 文件大小 修改时间戳  文件名如果 test不存在使用 -p删除文件夹下所有文件和子目录删除一个目录-i带有交互的询问通配符匹配…

    2022年10月3日
  • 手机java程序_郑州北大青鸟:用手机也能编写Java程序代码?

    手机java程序_郑州北大青鸟:用手机也能编写Java程序代码?你是不是也很好奇酷炫的程序是如何运行,代码是如何实现的?接下来就是见证奇迹的时刻,ACCP312班杨梦梦教你如何利用手机端写Java,详细步骤已上线!第一步在应用市场或者浏览器搜索AIDE,点击安装/下载。第二步安装完成后,在桌面找到AIDE,点击打开应用。第三步点击左上角Java技能旁边的菜单第四步打开菜单后,找到代码区域,点击开始。第五步找到JavaApplication(Java应用程序)…

    2022年7月7日
  • 中国历年出生人口性别比统计_2000年男女比例

    中国历年出生人口性别比统计_2000年男女比例年份比例总数男女1976年出生50.92%20,491,79710,435,19610,056,6011977年出生50.86%17,931,1559,119,6858,811,4701978年出生50.5

    2022年9月5日
  • 美股实时行情api接口(美股开户)

    所有美股历史交易行情数据,完整历史交易/任意时间段查询。1.产品功能支持所有历史美股交易查询;支持指定任意时间段查询;超高的查询效率,秒级返回;所有的交易数据为未复权的数据;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容AppleATS;全国多节点CDN部署;接口极速响应,多台服务器构建API接口负载均衡。2.API文档接口地址:https://api.gugudata.com/stock/us返回格式:

    2022年4月11日
  • c 语言条件运算符,C 语言条件运算符详细讲解

    c 语言条件运算符,C 语言条件运算符详细讲解C语言条件运算符详细讲解如果希望获得两个数中最大的一个,可以使用if语句,例如:if(a>b){max=a;}else{max=b;}不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格式为:表达式1?表达式2:表达式3条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值,否则以表达式3的值作为整…

    2022年10月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号