当前位置:文档之家› WSAAsyncSelect函数(MSDN)

WSAAsyncSelect函数(MSDN)

WSAAsyncSelect函数(MSDN)
WSAAsyncSelect函数(MSDN)

平台SDK:Windows套接字2

用WSAAsyncSelect

用WSAAsyncSelect函数请求基于Windows消息通知一个套接字的网络事件。

INT的WSAAsyncSelect(

插座S,

HWND HWND,

unsigned int的WMSG,

长LEVENT

);

参数

?

[in]一个描述符,识别需要插座事件通知。

HWND

[]当一个网络事件发生时,将收到一条消息标识窗口的句柄。

WMSG

[]当一个网络事件发生时要接收消息。

LEVENT

[]位掩码,指定相结合的网络事件的应用程序有兴趣的。

返回值

用WSAAsyncSelect函数成功,返回值是零,该应用程序的网络事件集的兴趣申报成功。否则,则返回值SOCKET_ERROR,一个特定的错误号码可以检索通过调用WSAGetLastError.Error代码含义

WSANOTINITIALISED成功地调用WSAStartup调用必须发生在使用此功能前。WSAENETDOWN网络子系统失败。

WSAEINVAL指定的参数之一是无效的,如窗口句柄不是指到现有的窗口,或指定的插座是处于无效状态。

WSAEINPROGRESS一个阻塞的Windows Sockets 1.1通话正在进行中,或者服务提供者仍在处理一个回调函数。

WSAENOTSOCK描述字不是一个插座。

额外的错误代码时,可以设置一个应用程序窗口接收到一条消息。此错误代码中提取从回复消息使用WSAGETSELECTERROR宏的lParam。下表中列出的每个网络事件的可能的错误代码。

事件:FD_CONNECT

错误代码含义

的WSAEAFNOSUPPORT地址在指定的家庭不能使用这个插座。WSAECONNREFUSED尝试连接被拒绝了。

不能达到WSAENETUNREACH网络,从这个主机在这个时候。WSAEFAULT namelen参数无效。

WSAEINVAL套接字已经绑定到一个地址。

WSAEISCONN套接字已连接。

WSAEMFILE没有更多的文件描述符。

WSAENOBUFS没有可用的缓冲区空间。不能被连接的套接字。WSAENOTCONN插座未连接。

WSAETIMEDOUT尝试连接超时没有建立连接。

事件:FD_CLOSE

错误代码含义

WSAENETDOWN网络子系统失败。

WSAECONNRESET远程端的连接被重置。

WSAECONNABORTED连接被终止,由于超时或其他故障。

事件:FD_ACCEPT

事件:FD_ADDRESS_LIST_CHANGE的

事件:FD_GROUP_QOS

事件:FD_OOB

事件:FD_QOS

事件:FD_READ

事件:FD_WRITE

错误代码含义

WSAENETDOWN网络子系统失败。

事件:FD_ROUTING_INTERFACE_CHANGE的

错误代码含义

指定的目的地WSAENETUNREACH,不再是可达。

WSAENETDOWN网络子系统失败。

备注

用WSAAsyncSelect函数是用来要求,WS2_32.DLL消息发送给窗口hWnd,当它检测到任何指定的网络事件由LEVENT参数。应该被发送的消息由的WMSG参数的指定。确定需要通知的套接字s参数。

用WSAAsyncSelect函数自动设置套接字s非阻塞模式,无论价值LEVENT。

要设置套接字s回成阻塞模式,它是通过调用的WSAAsyncSelect LEVENT设置为零,首先要清除事件记录与套接字s。然后,您可以调用ioctlsocket或WSAIoctl的设置套接字成阻塞模式。有关如何设置成阻塞模式非阻塞套接字欲了解更多信息,请参阅ioctlsocket WSAIoctl的功能。

使用下表中列出的任何值位OR运算符的Levent参数构造。

值含义

FD_READ将收到通知,准备阅读。

FD_WRITE想收到书面通知准备。

FD_OOB想收到通知OOB数据的到来。

FD_ACCEPT想收到通知的传入连接。

FD_CONNECT想完成连接或点对多点的连接操作,收到通知。

FD_CLOSE想收到通知套接字关闭。

FD_QOS想收到通知的插座质量,服务质量(QoS)的变化。

FD_GROUP_QOS想收到通知插座组质量服务(QoS)的变化(保留供将来使用插座组)。版权所有。

想收到FD_ROUTING_INTERFACE_CHANGE路由接口更改为指定的目标(S)的通知。

想收到FD_ADDRESS_LIST_CHANGE套接字协议族的本地地址列表变更通知。

一个套接字发出的WSAAsyncSelect取消任何先前的WSAAsyncSelect或WSAEventSelect相同的插座。例如,阅读和写作都收到通知,应用程序必须调用的WSAAsyncSelect FD_READ,FD_WRITE,具体如下:

RC =用WSAAsyncSelect(HWND,WMSG,FD_READ | FD_WRITE);

这是不可能为不同的事件指定不同的消息。下面的代码将无法正常工作,第二个呼叫将取消的影响第一,只有FD_WRITE事件将被报道消息wMsg2:

RC =的WSAAsyncSelect(HWND,wMsg1,FD_READ);在

RC =的WSAAsyncSelect(HWND,wMsg2,FD_WRITE);在

要取消所有通知,表明Windows套接字发送相关的网络事件插座上没有进一步的消息,LEVENT设置为零。

遥控=用WSAAsyncSelect(的hWnd,0,0);

用WSAAsyncSelect虽然立即停用事件消息发布的插座,在这种情况下,它是可能的消息可以在应用程序的消息队列中等待。因此,应用程序必须准备接收网络事件消息后取消。关闭套接字,则closesocket也取消的WSAAsyncSelect

消息发送,但队列中的消息仍然适用同样的警告。

由accept函数创建的套接字作为监听套接字用于接受它具有相同的属性。因此,用WSAAsyncSelect事件监听套接字设置也适用于接受的套接字。例如,如果一个监听套接字的的WSAAsyncSelect事件FD_ACCEPT,FD_READ,

FD_WRITE,则任何在该侦听套接字接纳插座将也有FD_ACCEPT,FD_READ,FD_WRITE事件用于消息具有相同的值WMSG。WMSG或事件如果使用不同的需要,应用程序应该调用的WSAAsyncSelect,通过公认的插座和所需的新数据。

当一个提名的网络事件发生在指定的套接字s,应用程序的窗口hWnd接收到消息wMsg。的wParam参数标识套接字的网络事件已经发生。lParam的低字指定网络已发生的事件。lParam的高字包含任何错误代码。错误代码是Winsock 2.h中定义的任何错误。

注意收到的事件通知消息后,WSAGetLastError函数不能用于检查错误值,因为错误的返回值可以从不同的lParam的高字中的值。

错误和事件代码可以摘录从lParam中使用的宏WSAGETSELECTERROR WSAGETSELECTEVENT Winsock 2.h中定义:

#定义WSAGETSELECTERROR lParam的HIWORD(lParam的)

#定义WSAGETSELECTEVENT的lParam的LOWORD(lParam的)

使用这些宏,将最大限度地提高应用程序的源代码的可移植性。

下表中列出的可能的网络事件代码可以返回。

值含义

FD_READ插座准备阅读。

FD_WRITE插座准备写作。

FD_OOB OOB准备套接字s读取数据

FD_ACCEPT插座准备好接受新的传入连接。

发起套接字s FD_CONNECT连接或点对多点的连接操作完成。

FD_CLOSE连接套接字s确定已经关闭。

服务与套接字s FD_QOS质量改变。

保留FD_GROUP_QOS。插座组,其中S所属相关服务质量改变(保留供将来使用插座组)。

应该使用的发送到指定的目的地的本地接口

FD_ROUTING_INTERFACE_CHANGE已经改变了。

FD_ADDRESS_LIST_CHANGE改变套接字协议族的应用客户端可以绑定的地址列表。

用WSAAsyncSelect虽然可以被称为有兴趣在多个事件中,应用程序窗口将接收一个消息,为每一个网络事件。

至于选择功能的情况下,用WSAAsyncSelect经常会被用来确定当数据传输操作(send或recv)可以发出立即取得成功的期望。然而,一个强大的应用程序必须准备的可能性,它可以收到一条消息,并发出一个Windows套接字调用立即返回WSAEWOULDBLOCK。例如,下面的事件序列是可能的:

数据到达套接字s,Windows套接字2职位的WSAAsyncSelect消息

应用程序处理一些其他的消息

虽然处理,应用问题ioctlsocket(到来)和通知有数据准备好被读取

读取数据的应用问题一个recv(...)

应用循环处理下一个消息,最终达到用WSAAsyncSelect消息,表明数据是准备读

应用问题的recv(...),失败的错误WSAEWOULDBLOCK。

其他序列也是可能的。

ws2_32.dll就不会不断地涌入应用程序与一个特定的网络事件的消息。在成功发布特定事件通知给应用程序窗口,没有进一步的消息(次),网络事件将被张贴到应用程序窗口,直到应用程序函数调用的隐式重新启用该网络事件的通知。事件重新启用功能

FD_READ的recv,recvfrom,WSARecv时或WSARecvFrom。

FD_WRITE发送,SENDTO,使用WSASend,或WSASendTo()函数调用。FD_OOB RECV,recvfrom,WSARecv时或WSARecvFrom的。

,FD_ACCEPT接受或WSAAccept除非错误代码WSATRY_AGAIN表明条件函数返回CF_DEFER的。

FD_CONNECT无。

FD_CLOSE无。

FD_QOS WSAIoctl的命令SIO_GET_QOS。

保留FD_GROUP_QOS。WSAIoctl的命令SIO_GET_GROUP_QOS(保留供将来使用插座组)。

FD_ROUTING_INTERFACE_CHANGE的WSAIoctl命令

SIO_ROUTING_INTERFACE_CHANGE。

FD_ADDRESS_LIST_CHANGE的WSAIoctl命令

SIO_ADDRESS_LIST_CHANGE。

重新启用程序的任何调用,即使失败了,结果在有关事件的信息发布重新启用。

对于FD_READ,FD_OOB,FD_ACCEPT事件,消息发布为电平触发。这意味着,如果重新启用程序被调用和调用后仍符合有关条件,用WSAAsyncSelect 消息发布到应用程序。这允许应用程序为事件驱动,而不是被关注的数据量,在任何一个时间到达。考虑下面的序列:

网络传输堆栈接收100个字节的数据插座和原因的Windows Sockets 2发布FD_READ消息。

应用问题的recv(buffptr,50,0),读取50个字节。

另一个FD_READ消息发布的,因为仍然有要读取的数据。

与这些语义,应用程序不需要读取FD_READ消息响应- 每个FD_READ消息响应一个单一的recv所有可用的数据是适当的。如果多个应用程序发出的recv 调用到一个单一的FD_READ,它可以接收多个FD_READ消息。这样的应用程序需要禁用FD_READ消息开始前的recv调用FD_READ事件未设置调用的WSAAsyncSelect。

的的FD_QOS和FD_GROUP_QOS事件被认为是边沿触发。一次发生的服务质量变化时,一条消息将被张贴。进一步的消息将水解不了近渴,直至提供检测服务质量的进一步变化,或者应用程序重新协商的服务质量插座。

当到达目的地的WSAIoctl与SIO_ROUTING_INTERFACE_CHANGE变化后IOCTL中指定应该使用本地接口已发出该

FD_ROUTING_INTERFACE_CHANGE消息发布。

该FD_ADDRESS_LIST_CHANGE消息发布时已发出的地址列表中的应用程序

可以绑定后的WSAIoctl SIO_ADDRESS_LIST_CHANGE变化。

当应用程序调用的WSAAsyncSelect或重新启用函数被调用时,如果有任何事件发生,那么消息公布(如适用)。例如,请考虑以下顺序:

应用程序调用listen。

收到连接请求,但尚未被接受。

的的WSAAsyncSelect指定接收FD_ACCEPT消息插座,它需要应用程序调用。由于事件的持久性,Windows套接字2个FD_ACCEPT消息立即。

FD_WRITE事件的处理略有不同。FD_WRITE消息发布插座时首先连接连接或WSAConnect(FD_CONNECT后,如果还注册)或接受接受或WSAAccept,之后发送操作失败WSAEWOULDBLOCK和缓冲空间变得可用。因此,应用程序可以假设发送FD_WRITE消息从第一开始,一直持续到发送返回WSAEWOULDBLOCK是可能的。此类故障后,应用程序将收到再次发送

FD_WRITE消息。

FD_OOB事件仅用于当套接字被配置为接收OOB数据分开。如果套接字被配置为接收OOB数据内嵌,OOB(加急)数据将被视为正常的数据和应用程序应该注册一个兴趣,并会收到FD_READ事件,而不是FD_OOB事件。一个应用程序可以设置或检查的方式,OOB数据是要处理的SO_OOBINLINE选项使用setsockopt或getsockopt。

FD_CLOSE消息中的错误代码表示的插座是否正常或接近流产。如果错误代码是零,那么近得落落大方,如果错误代码,然后WSAECONNRESET插座的虚拟电路复位。这仅适用于面向连接的套接字如SOCK_STREAM。

FD_CLOSE消息发布的密切的指示时,接收到的对应的套接字的虚电路。在TCP 条款,这意味着FD_CLOSE发布时间等待或关闭等待状态时的连接进入。这样的结果从远端执行在发送端关机或关闭套接字。FD_CLOSE应该只发布一个socket读取所有数据后,但应用程序应检查收到FD_CLOSE后剩余的数据,以避免任何数据丢失的可能性。

请注意FD_CLOSE应用程序将只接收消息,指示关闭虚电路,只有当所有接收到的数据被读取,如果这是一个正常关闭。它不会收到FD_READ消息表明这个条件。

的FD_QOS或FD_GROUP_QOS消息发布时与套接字s或插座组s对应的流程规范中的任何参数发生了变化,分别。应用程序应该使用WSAIoctl的命令SIO_GET_QOS或SIO_GET_GROUP_QOS的插座或插座S组分别属于来得到当前的服务质量。

边沿触发,以及被认为是的FD_ROUTING_INTERFACE_CHANGE和

FD_ADDRESS_LIST_CHANGE事件。发布一条消息将被完全一旦发生变化时应用后,已要求WSAIoctl的与SIO_ROUTING_INTERFACE_CHANGE或SIO_ADDRESS_LIST_CHANGE发出相应的通知。进一步的消息将不会IOCTL 即将直到申请补发IOCTL和检测到的另一个变化是,因为已发出。

下面是总结的事件和条件,每个异步通知消息。

FD_READ:

用WSAAsyncSelect被称为时,如果有数据接收。

当数据到达时,如果尚未发布FD_READ。

recv或recvfrom后称为,带或不带MSG_PEEK),如果数据仍然是可用来接收。

注意当使用setsockopt SO_OOBINLINE被启用,数据既包括正常的数据和OOB 数据,在如上所述的实例。

FD_WRITE:

当用WSAAsyncSelect调用,如果一个发送或SENDTO的是可能的。

调用,当连接建立后,连接或接受。

发送后或SENDTO失败WSAEWOULDBLOCK时发送或SENDTO的可能成功的。

连接的套接字绑定后。FD_WRITE可能会或可能不会发生在这个时候(依赖于实现)。在任何情况下,无连接的套接字总是写入后立即绑定操作。

FD_OOB:只有有效setsockopt的SO_OOBINLINE被禁用(默认)。

当用WSAAsyncSelect叫,如果是的OOB数据,目前可用于接收与MSG_OOB 标志。

当OOB数据到达时,如果FD_OOB尚未发布。

经过recv或recvfrom带或不带MSG_OOB标志,如果OOB数据仍然是可用来接收。

FD_ACCEPT:

当用WSAAsyncSelect调用,如果目前有接受连接请求。

当一个连接请求到达时,如果FD_ACCEPT尚未发布。

接受呼叫后,如果有可以接受另一个连接请求。

FD_CONNECT:

当用WSAAsyncSelect调用,如果目前有建立一个连接。

称为连接后,当连接建立后,即使立即连接成功,是典型的数据报套接字。

调用的话WSAJoinLeaf后,加入时操作完成。

连接后,WSAConnect,或,WSAJoinLeaf被称为非阻塞的,面向连接的插座。运营初期WSAEWOULDBLOCK返回一个特定的错误,而是的网络操作径自。操作是否最终成功与否,当胜负已确定时,FD_CONNECT发生。客户端应该检查错误代码,以确定是否结果是成功还是失败。

FD_CLOSE:只适用于面向连接的套接字(例如,SOCK_STREAM)

用WSAAsyncSelect调用,如果套接字连接已经关闭。

在远程系统启动时正常关闭,当前没有可用数据接收(请注意,如果数据已收到并正在等待在远程系统启动时读取正常关闭,FD_CLOSE未交付,直到所有挂起的数据一直读取)。

本地系统启动后关断及远程系统已正常关闭“数据结尾”的通知(例如,TCP FIN),当前没有可用数据时接收回应。

当远程系统终止连接(例如,发送TCP RST),和lParam包含WSAECONNRESET错误值。

注意FD_CLOSE则closesocket被称为后,不张贴。

FD_QOS:

用WSAAsyncSelect叫时,如果已更改与套接字相关联的服务质量。WSAIoctl的与SIO_GET_QOS称为后,当服务质量的改变。

保留FD_GROUP_QOS。

FD_ROUTING_INTERFACE_CHANGE:

后与SIO_ROUTING_INTERFACE_CHANGE WSAIoctl的叫,当到达目的地指定的IOCTL变化中应该使用本地接口。

FD_ADDRESS_LIST_CHANGE:

后与SIO_ADDRESS_LIST_CHANGE WSAIoctl的调用,当本地地址的列表,应用程序可以绑定的变化。

要求

客户端需要时,Windows 98,Windows Me中的Windows XP,Windows 2000专业版,Windows NT工作站或Windows 95。

服务器需要Windows Server 2003时,Windows 2000 Server或Windows NT 服务器。

头在Winsock 2.h中宣布。

WS2_32.LIB库链接。

DLL需要WS2_32.DLL。

参见

Winsock的参考,Winsock的功能,选择,WSAEventSelect

-------------------------------------------------- ------------------------------

最后更新:2005年3月|你怎么看这个话题?|订购平台SDK CD

?微软公司。保留所有权利。使用条款。

要求

客户端需要时,Windows 98,Windows Me中的Windows XP,Windows 2000专业版,Windows NT工作站或Windows 95。

服务器需要Windows Server 2003时,Windows 2000 Server或Windows NT 服务器。

头在Winsock 2.h中宣布。

WS2_32.LIB库链接。

DLL需要WS2_32.DLL。

参见

Winsock的参考,Winsock的功能,选择,WSAEventSelect

撤消修改

相关主题
文本预览
相关文档 最新文档