详情参阅:https://msdn.microsoft.com/en-us/library/windows/desktop/ms741513(v=vs.85).aspx

首先了解accept、AcceptEx、WSAAccept的区别 .

1. accept、WSAAccept是同步操作,AcceptEx是异步操作

2. WSAAccept函数早accept函数基础上添加了条件函数判断是否接受客户端连接

3. AcceptEx是异步的,可以同时发出多个AcceptEx请求,支持重叠IO操作.

WSAAccept()

简述

有条件地接受一个连接基于状态函数的返回值,选择创建或加入一个套接字组,提供QOS flowspecs,允许连接数据的转移。 

函数原型

SOCKET WSAAccept(
  _In_    SOCKET          s,
  _Out_   struct sockaddr *addr,
  _Inout_ LPINT           addrlen,
  _In_    LPCONDITIONPROC lpfnCondition,
  _In_    DWORD_PTR       dwCallbackData
);

参数说明 

  s:标识一个套接口的描述字,该套接口在listen()后监听连接。 

  addr:(可选)指针,指向存放通讯层所知的连接实体地址的缓冲区。addr参数的具体格式由套接口创建时产生的地址族决定。 

  addrlen:(可选)指针,指向存放addr地址长度的整形数。 

  lpfnCondition:(可选的)用户提供的条件函数的进程实例地址。该函数根据参数传入的调用者信息作出接受或拒绝的决定,并通过给结果参数赋予特定的值来(可选地)创建和/或加入一个套接口组。 

  dwCallbackData:作为条件函数参数返回给应用程序的回调数据。WinSock不分析该参数。

返回值

  若无错误发生,WSAAccept()函数返回所接受套接口的描述字。

  否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。

附注

  这个WSAAccept函数提取 等待链接队列(SOCKET s)中的第一个链接。

  如果条件函数lpfnCondition不为NULL,则根据条件函数检测它是否符合条件。

  如果条件函数返回CF_ACCEPT,WSAAccept创建一个新的套接字。新创建的套接字和SOCKET s具有相同的属性,包括WSAAsyncSelect或WSAEventSelect 注册的异步事件。

  如果条件函数返回CF_REJECT,WSAAccept拒绝这个连接请求。

  条件函数运行在相同的线程,应尽快快速返回。

  条件函数应该返回 CF_DEFER表明没有作出如何处理这个连接请求的决定。当应用程序可以处理这个连接请求时,就可以再次调用WSAAccept,并将 CF_ACCEPT 或者 CF_REJECT作为条件函数的返回值。

错误代码

  WSANOTINITIALISED 在调用本API之前应成功调用WSAStartup()。 

  WSAECONNREFUSED 根据条件函数的返回值(CF_REJECT)强制拒绝连接请求。 

  WSAENETDOWN 网络子系统失效。 

  WSAEFAULT addrlen参数太小(小于sockaddr结构的大小),或者lpfnCondition并不是用户空间的一部分。 

  WSAEINTR 通过WSACancelBlockingCall()函数取消(阻塞)调用。 

  WSAEINPROGRESS 一个阻塞WinSock调用正在进行。 

  WSAEINVAL WSAAccept()调用前未执行listen()调用;条件函数中的g参数非法;条件函数的返回值非法;套接口处于非法状态。 

  WSAEMFILE WSAAccept()调用时排队队列非空,且无可用套接口描述字。 

  WSAENOBUFS 无可用缓冲区空间。 

  WSAENOTSOCK 描述字不是一个套接口。 

  WSAEOPNOTSUPP 所引用的套接口不是支持面向连接服务类型的。 

  WSATRY_AGAIN 根据条件函数的返回值(CF_DEFER) ,连接请求被推迟。 

  WSAEWOULDBLOCK 套接口标志为非阻塞,无连接请求供接受。 

  WSAEACCES 被推迟的连接请求超时或撤销。 

 

版权声明:本文为jasonsword原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jasonsword/p/7531437.html