wsaaccept AcceptEx

平台SDK:Windows套接字

AcceptEx

Windows套接字AcceptEx函数接受一个新的连接,返回本地和远程地址,并接收由客户端应用程序发送的第一块数据。Windows 95/98不支持AcceptEx函数。

注意:此函数是一个Microsoft特定的扩展,Windows Sockets规范。有关详细信息,请参阅Microsoft扩展和Windows Sockets 2。

BOOL AcceptEx(

IN SOCKET sListenSocket,

IN SOCKET sAcceptSocket,

IN PVOID lpOutputBuffer,

IN DWORD dwReceiveDataLength,

IN DWORD dwLocalAddressLength,

IN DWORD dwRemoteAddressLength,

OUT LPDWORD lpdwBytesReceived,

IN LPOVERLAPPEDlpOverlapped

);

参数

sListenSocket

[in]侦听套接字。服务器应用程序在这个套接字上等待连接。

sAcceptSocket

[in]将用于连接的套接字。此套接字必须不能已经绑定或者已经连接。

lpOutputBuffer

[in]指向一个缓冲区,该缓冲区用于接收新建连接的所发送数据的第一个块、该服务器的本地地址和客户端的远程地址。接收到的数据将被写入到缓冲区0偏移处,而地址随后写入。 该参数必须指定,如果此参数设置为NULL,将不会得到执行,也无法通过GetAcceptExsockaddrs函数获得本地或远程的地址。

dwReceiveDataLength

[in]lpOutputBuffer字节数,指定接收数据缓冲区lpOutputBuffer的大小。这一大小应不包括服务器的本地地址的大小或客户端的远程地址,他们被追加到输出缓冲区。如果dwReceiveDataLength是零,AcceptEx将不等待接收任何数据,而是尽快建立连接。

dwLocalAddressLength

[in]为本地地址信息保留的字节数。此值必须比所用传输协议的最大地址大小长16个字节。

dwRemoteAddressLength

[in]为远程地址的信息保留的字节数。此值必须比所用传输协议的最大地址大小长16个字节。 该值不能为0。

dwBytesReceived

[out]指向一个DWORD用于标识接收到的字节数。此参数只有在同步模式下有意义。如果函数返回ERROR_IO_PENDING并在迟些时候完成操作,那么这个DWORD没有意义,这时你必须获得从完成通知机制中读取操作字节数。

lpOverlapped

[in]一个OVERLAPPED结构,用于处理请求。此参数必须指定,它不能为空。

返回值

如果没有错误发生,AcceptEx函数成功完成和真正的返回值。

如果函数失败,AcceptEx返回FALSE。该WSAGetLastError函数可以调用返回扩展的错误信息。如果WSAGetLastError返回ERROR_IO_PENDING,那么这次行动成功启动并仍在进行中。

备注

*在AcceptEx结合了几个socket函数的功能,acceptEx函数当成功时执行三项任务:

1. 一个新的连接被接受。

2. 返回连接的本地和远程地址。

3. 得到远程发送的第一个数据块。

*较accept函数而言,程序使用AcceptEx可以更快连接到一个套接字。

*输出缓冲区lpOutputBuffer存放内容包括:接收到的第一块数据、本地套接字地址(服务器)和远程套接字地址(客户端)。

使用单一的缓冲区可以提高性能,当使用AcceptEx时,必须使用GetAcceptExSockaddrs函数将输出缓冲区的内容解析到三个不同部分的缓冲区 (data, local socket address, and remote socket address)。 在windows XP 及随后版本中,当AcceptEx函数完成操作并且SO_UPDATE_ACCEPT_CONTEXT选项在被接受的socket中被设置时, socket相关的本地地址(local address )可以使用getsockname函数获得。类似的,与被接受socket 相关的远程端地址(the remote address)可以使用getpeername函数获得。

*本地和远程地址缓冲区的大小必须比使用传输协议的sockaddr地址大16个字节,是因为是以内部格式写入。例如,一个SOCKADDR_IN大小(TCP / IP协议的地址结构)是16个字节。因此,本地和远程地址缓冲区的大小必须指定至少32个字节。

*AcceptEx函数使用的重叠I / O。与使用accept相比,使用AcceptEx能以相对较少的线程数量处理大量的客户。如同所有的Win32重叠函数,Win32事件或完成端口都可用来作为完成通知机制。

AcceptEx和accept函数的另一个主要区别是,AcceptEx函数需要调用者提供两个套接字参数:

一个指定监听套接字。

一个指定接受连接的套接字。

该sAcceptSocket参数必须是一个已经打开的socket,不能是已绑定或者是已连接的socket。

*GetQueuedCompletionStatus函数或GetOverlappedResult函数的lpNumberOfBytesTransferred参数表明该请求接收到的字节数。

当此操作成功完成,sAcceptSocket可以使用,但只限下列功能:

ReadFile

WriteFile

发送

recv

TransmitFile

关闭套接字

注意:如果调用TransmitFile函数时,指定TF_DISCONNECT和TF_REUSE_SOCKET标志,指定套接字的已返回未绑定,未连接的状态。然后,您可以使用该套接字句柄作为AcceptEx函数的sAcceptSocket参数。但该套接字不能作为ConnectEx函数的参数。

当AcceptEx函数返回时,sAcceptSocket是一个已连接套接字。如未指定SO_UPDATE_ACCEPT_CONTEXT属性,sAcceptSocket不继承与sListenSocket参数相关套接字的属性。使用setsockopt函数来设置SO_UPDATE_ACCEPT_CONTEXT选项,指定sAcceptSocket的套接字句柄和sListenSocket作为选项的值(specifyingsAcceptSocketas the socket handle andsListenSocketas the option value) 。

例如:

error= setsockopt(sAcceptSocket,

SOL_SOCKET,

SO_UPDATE_ACCEPT_CONTEXT,

(char*)&sListenSocket,

sizeof(sListenSocket));

如果提供了数据接收缓冲区(dwReceiveDataLength!=0),异步操作将在连接建立并且接收到第一块数据后完成。使用GETSOCKOPT的SO_CONNECT_TIME选项来检查连接是否已经接受。如果它已被接受,您可以判断连接建立多久。该选项的返回值是套接字连接已建立的秒数。如果套接字未连接,getsockopt返回0xFFFFFFFF。应用程序通过检查SO_CONNECT_TIME并结合检查异步操作是否完成,可以确定是否连接已建立了一段时间但没有收到任何数据。我们建议您终止这些连接,可以通过关闭连接强制AcceptEx完成操作,并返回一个错误状态。

例如:

int seconds;

BYTE opt = sizeof(seconds);

error == getsockopt(sAcceptSocket,SOL_SOCKET,SO_CONNECT_TIME,

(char*)&seconds,(int)&opt);

if(error= NO_ERROR){

printf(“getsockopt(SO_CONNECT_TIME)失败:%d N”的,WSAGetLastError());

exit(1);

}

Notes for ATM

没有与连接设置相关的重要问题时,使用Windows套接字2异步传输模式(ATM)。请参阅Windows套接字2备注部分承担重要的ATM连接设置信息函数文档。

需求

系统版本:要求Windows套接字1.1或更高版本。微软专用的扩展。

头文件:#include Mswsock.h。

导入库:Mswsock.lib。

建于2009年5月12日,2000Requirements

版本:要求Windows套接字1.1或更高版本。微软专用的扩展。

wsaaccept AcceptEx
  

爱华网本文地址 » http://www.413yy.cn/a/8103520103/126283.html

更多阅读

古永锵:移动屏视频商业化爆发将快于PC

     视频行业已进入多屏时代,移动端业务商业化会否从视频开始?  网页观看模式的增长将趋于平缓,伴随化、个性化的移动视频将创造更突出的营销价值。  “技术”圈地  古永锵又一次出现在上海。  半年之前,他曾经预言2013年

南京瞻园怎么样 瞻园

   瞻园是国家级文物保护单位。是乾隆皇帝以以欧阳修诗“瞻望玉堂,如在天上”而命名。位于南京城南瞻园路。坐北朝南,纵深127米,东西宽123米,总面积15621平方米。至今已有六百余年的历史。瞻园也是南京仅存的一组保存完好的

声明:《wsaaccept AcceptEx》为网友爱自己更爱别人分享!如侵犯到您的合法权益请联系我们删除