• WinSock IO模型 -- WSAEventSelect模型事件触发条件说明


     

    1. FD_READ事件

    l  调用WSAEventSelect函数时,如果当前有数据可读

    l  有数据到达时,并且没有发送过FD_READ事件

    l  调用recv/recvfrom函数后,仍然有数据可读时

    1. RD_WRITE事件

    l  调用WSAEventSelect函数时,如果调用能够发送数据时

    l  调用connect()/accept()后,连接已经建立时

    l  调用send()/sendto()函数后,返回WSAEWOULDBLOCK错误后,再次调用send()/sendto()函数可能成功时

    1. FD_ACCEPT事件

    l  调用WSAEventSelect函数时,有连接请求需要建立

    l  连接请求到达,未有发送FD_ACCEPT事件

    l  调用accept()函数后,还有连接请求需要建立

    1. FD_CONNECT事件

    l  调用WSAEventSelect函数时,一个连接已经建立完成

    l  调用connect()函数后,建立连接完成时

    1. FD_CLOSE事件

    l  调用WSAEventSelect函数时,socket连接关闭

    l  从容关闭,没有数据可读

    l  执行shutdown()从容关闭,对方应答FIN后,无数据需要读取

    l  对方关闭连接,WSAECONNRESET错误发生

    Network Event description from MSDN. Good details for each event.

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

    Here is a summary of events and conditions for each asynchronous notification message.

    • FD_READ:
      1. When WSAAsyncSelect is called, if there is data currently available to receive.
      2. When data arrives, if FD_READ is not already posted.
      3. After recv or recvfrom is called, with or without MSG_PEEK), if data is still available to receive.

        Note  When setsockopt SO_OOBINLINE is enabled, data includes both normal data and OOB data in the instances noted above.

    • FD_WRITE:
      1. When WSAAsyncSelect called, if a send or sendto is possible.
      2. After connect or accept called, when connection established.
      3. After send or sendto fail with WSAEWOULDBLOCK, when send or sendto are likely to succeed.
      4. After bind on a connectionless socket. FD_WRITE may or may not occur at this time (implementation-dependent). In any case, a connectionless socket is always writeable immediately after a bind operation.
    • FD_OOB: Only valid when setsockopt SO_OOBINLINE is disabled (default).
      1. When WSAAsyncSelect called, if there is OOB data currently available to receive with the MSG_OOB flag.
      2. When OOB data arrives, if FD_OOB not already posted.
      3. After recv or recvfrom called with or without MSG_OOB flag, if OOB data is still available to receive.
    • FD_ACCEPT:
      1. When WSAAsyncSelect called, if there is currently a connection request available to accept.
      2. When a connection request arrives, if FD_ACCEPT not already posted.
      3. After accept called, if there is another connection request available to accept.
    • FD_CONNECT:
      1. When WSAAsyncSelect called, if there is currently a connection established.
      2. After connect called, when connection is established, even when connect succeeds immediately, as is typical with a datagram socket.
      3. After calling WSAJoinLeaf, when join operation completes.
      4. After connectWSAConnect, or WSAJoinLeaf was called with a nonblocking, connection-oriented socket. The initial operation returned with a specific error of WSAEWOULDBLOCK, but the network operation went ahead. Whether the operation eventually succeeds or not, when the outcome has been determined, FD_CONNECT happens. The client should check the error code to determine whether the outcome was successful or failed.
    • FD_CLOSE: Only valid on connection-oriented sockets (for example, SOCK_STREAM)
      1. When WSAAsyncSelect called, if socket connection has been closed.
      2. After remote system initiated graceful close, when no data currently available to receive (Be aware that, if data has been received and is waiting to be read when the remote system initiates a graceful close, the FD_CLOSE is not delivered until all pending data has been read).
      3. After local system initiates graceful close with shutdown and remote system has responded with "End of Data" notification (for example, TCP FIN), when no data currently available to receive.
      4. When remote system terminates connection (for example, sent TCP RST), and lParam will containWSAECONNRESET error value.

        Note  FD_CLOSE is not posted after closesocket is called.

    • FD_QOS:
      1. When WSAAsyncSelect called, if the quality of service associated with the socket has been changed.
      2. After WSAIoctl with SIO_GET_QOS called, when the quality of service is changed.
    • FD_GROUP_QOS: Reserved.
    • FD_ROUTING_INTERFACE_CHANGE:
      •  
        • After WSAIoctl with SIO_ROUTING_INTERFACE_CHANGE called, when the local interface that should be used to reach the destination specified in the IOCTL changes.
    • FD_ADDRESS_LIST_CHANGE:
      •  
        • After WSAIoctl with SIO_ADDRESS_LIST_CHANGE called, when the list of local addresses to which the application can bind changes.
  • 相关阅读:
    非模式窗体和模式窗体(转
    一次性帮你解决毕业论文的所有排版问题
    c# Wndproc的使用方法
    ref和out 转
    c# 基本语法(转)
    U盘装/虚拟光驱 装双系统
    U盘启动盘 装系统
    Hibernate查询条件封装对象Expression介绍 Hi
    asp.net实现 gridview 鼠标单击任意字段选中一行 ,并获取数据 Hi
    C#如何取出非公共成员 Hi
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4502847.html
Copyright © 2020-2023  润新知