zoukankan      html  css  js  c++  java
  • WSAEventSelect模型

    WSAEventSelect模型

    EventSelect

    WSAEventSelect function

    The WSAEventSelect function specifies an event object to be associated with the specified set of FD_XXX network events.

    int WSAAPI WSAEventSelect(
      SOCKET   s,
      WSAEVENT hEventObject,
      long     lNetworkEvents
    );
    

    s
    A descriptor identifying the socket.
    hEventObject
    A handle identifying the event object to be associated with the specified set of FD_XXX network events.
    lNetworkEvents
    A bitmask that specifies the combination of FD_XXX network events in which the application has interest.

    WSAEventSelect(s, hEventObject, FD_READ|FD_WRITE);
    

    Remark

    The WSAEventSelect function is used to specify an event object, hEventObject, to be associated with the selected FD_XXX network events, lNetworkEvents. The socket for which an event object is specified is identified by the s parameter. The event object is set when any of the nominated network events occur.

    CreateEvent、CloseEvent、SetEvent、ResetEvent

    WSACreateEvent function

    The WSACreateEvent function creates a new event object.

    WSAEVENT WSAAPI WSACreateEvent(
    );
    

    Remark

    The WSACreateEvent function creates a manual-reset event object with an initial state of nonsignaled.

    WSACloseEvent function

    The WSACloseEvent function closes an open event object handle.

    BOOL WSAAPI WSACloseEvent(
      WSAEVENT hEvent
    );
    

    WSASetEvent function

    The WSASetEvent function sets the state of the specified event object to signaled.

    BOOL WSAAPI WSASetEvent(
      WSAEVENT hEvent
    );
    

    WSAResetEvent function

    The WSAResetEvent function resets the state of the specified event object to nonsignaled.

    BOOL WSAAPI WSAResetEvent(
      WSAEVENT hEvent
    );
    

    WaitForMultipleEvents

    WSAWaitForMultipleEvents function

    The WSAWaitForMultipleEvents function returns when one or all of the specified event objects are in the signaled state, when the time-out interval expires, or when an I/O completion routine has executed.

    DWORD WSAAPI WSAWaitForMultipleEvents(
      DWORD          cEvents,
      const WSAEVENT *lphEvents,
      BOOL           fWaitAll,
      DWORD          dwTimeout,
      BOOL           fAlertable
    );
    

    cEvents
    The number of event object handles in the array pointed to by lphEvents.
    lphEvents
    A pointer to an array of event object handles.
    fWaitAll
    If TRUE, the function returns when the state of all objects in the lphEvents array is signaled. If FALSE, the function returns when any of the event objects is signaled.
    dwTimeout
    The time-out interval, in milliseconds.
    fAlertable
    A value that specifies whether the thread is placed in an alertable wait state so the system can execute I/O completion routines. If TRUE, the thread is placed in an alertable wait state and WSAWaitForMultipleEvents can return when the system executes an I/O completion routine. If FALSE, the thread is not placed in an alertable wait state and I/O completion routines are not executed.

    EnumNetworkEvents

    WSAEnumNetworkEvents function

    The WSAEnumNetworkEvents function discovers occurrences of network events for the indicated socket, clear internal network event records, and reset event objects (optional).

    int WSAAPI WSAEnumNetworkEvents(
      SOCKET             s,
      WSAEVENT           hEventObject,
      LPWSANETWORKEVENTS lpNetworkEvents
    );
    

    s
    A descriptor identifying the socket.
    hEventObject
    An optional handle identifying an associated event object to be reset.
    lpNetworkEvents
    A pointer to a WSANETWORKEVENTS structure that is filled with a record of network events that occurred and any associated error codes.

    Remark

    The WSAEnumNetworkEvents function is used to discover which network events have occurred for the indicated socket since the last invocation of this function. It is intended for use in conjunction with WSAEventSelect, which associates an event object with one or more network events.

    Example

    #ifndef UNICODE
    #define UNICODE
    #endif
    
    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    
    #include <winsock2.h>
    #include <Ws2tcpip.h>
    #include <stdio.h>
    
    // Link with ws2_32.lib
    #pragma comment(lib, "Ws2_32.lib")
    
    int main()
    {
    //-------------------------
    // Declare and initialize variables
        WSADATA wsaData;
        int iResult;
    
        SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS], ListenSocket;
        WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
        WSANETWORKEVENTS NetworkEvents;
        sockaddr_in InetAddr;
        DWORD EventTotal = 0;
        DWORD Index;
        DWORD i;
        
        HANDLE NewEvent = NULL; 
    
        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
            wprintf(L"WSAStartup failed with error: %d
    ", iResult);
            return 1;
        }
    
    //-------------------------
    // Create a listening socket
        ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (ListenSocket == INVALID_SOCKET) {
            wprintf(L"socket function failed with error: %d
    ", WSAGetLastError() );
            return 1;
        }
        
        InetAddr.sin_family = AF_INET;
        InetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        InetAddr.sin_port = htons(27015);
    
    //-------------------------
    // Bind the listening socket
        iResult = bind(ListenSocket, (SOCKADDR *) & InetAddr, sizeof (InetAddr));
        if (iResult != 0) {
            wprintf(L"bind failed with error: %d
    ", WSAGetLastError() );
            return 1;
        }
    
    //-------------------------
    // Create a new event
        NewEvent = WSACreateEvent();
        if (NewEvent == NULL) {
            wprintf(L"WSACreateEvent failed with error: %d
    ", GetLastError() );
            return 1;
        }    
    
    //-------------------------
    // Associate event types FD_ACCEPT and FD_CLOSE
    // with the listening socket and NewEvent
        iResult = WSAEventSelect(ListenSocket, NewEvent, FD_ACCEPT | FD_CLOSE);
        if (iResult != 0) {
            wprintf(L"WSAEventSelect failed with error: %d
    ", WSAGetLastError() );
            return 1;
        }
    
    //-------------------------
    // Start listening on the socket
        iResult = listen(ListenSocket, 10);
        if (iResult != 0) {
            wprintf(L"listen failed with error: %d
    ", WSAGetLastError() );
            return 1;
        }
    
    //-------------------------
    // Add the socket and event to the arrays, increment number of events
        SocketArray[EventTotal] = ListenSocket;
        EventArray[EventTotal] = NewEvent;
        EventTotal++;
    
    //-------------------------
    // Wait for network events on all sockets
        Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
        Index = Index - WSA_WAIT_EVENT_0;
    
    //-------------------------
    // Iterate through all events and enumerate
    // if the wait does not fail.
        for (i = Index; i < EventTotal; i++) {
            Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 1000, FALSE);
            if ((Index != WSA_WAIT_FAILED) && (Index != WSA_WAIT_TIMEOUT)) {
                WSAEnumNetworkEvents(SocketArray[i], EventArray[i], &NetworkEvents);
            }
        }
    
    //...
        return 0;
    
  • 相关阅读:
    centos8.2安装nginx
    Centos8安装PostgreSQL
    PostgreSQL 安装时提示下载元数据失败
    MySQL8定时备份
    Centos8安装Docker
    Centos8安装中文字体
    Centos8源码安装libgdiplus
    MySQL拖拽排序
    MySQL8修改事务隔离级别
    MySQL启动问题
  • 原文地址:https://www.cnblogs.com/lkpp/p/WSAEventSelect.html
Copyright © 2011-2022 走看看