• 2006-11-27

    8.2.3WSAEventSelect - [winsock]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://xingzhesun.blogbus.com/logs/3921298.html

    8.2.3WSAEventSelect
    应用程序在一个或者多个套接字上,接收以事件为基础的网络事件通知。网络事件投递至一个事件对象句柄。
    事件通知
    WSAVENT WSACreateEvent(void);
    BOOL WSAResetEvent(WSAEVENT hEvent);
    BOOL WSACloseEvent(WSAEVENT hEvent);
    int WSAEventSelect(SOCKET S, WSAEVENT hEventObject, long lNetworkEvents);

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

    Index = WSAWaitForMultipleEvents();
    MyEvent = EventArray[index - WSA_WAIT_EVENT_0];
    int WSAEnumNetworkEvents(SOCKET s, WSAEVET hEventObject, LPWSANETWORKEVENTS lpNetworkEvents);

    SOCKET Socket[WSA_MAXIMUM_MAIT_EVENTS];
    WSAEVENT Event[WSA_MAXIMUM_MAIT_EVENTS];
    SOCKET Accept, Listen;
    DWORD EventTotal = 0;
    DWORD Index;

    //Set up a TCP socket for listening on port 5150;
    Listen = socket(PF_INET, SOCKET_STREAM, 0);

    InternetAddr.sin_family = AF_INET;
    InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InternetAddr.sin_port = htons(5105);

    bind(Listen, (PSOCKADDR)&InternetAddr, sizeof(InternetAddr));

    NewEvent = WSACreateEvent();

    WSAEventSelect(Listen, NewEvent, FD_ACCEP|FD_CLOSE);

    listen(Listen, 5);

    Socket[EventTotal] = Listen;
    Event[EventTotal] = NewEvent;
    EventTotal++;

    while(TRUE)
    {
    //Wait for network events on all sockets
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);

    WSAEnumNetworkEvents(SocketArray[Index - WSAWAIT_EVENT_0],EventArray[Index_WSA_WAIT_EVENT_0], &NetworkEvents);

    //check for FD_ACCEPT messages
    if(NetWorkEvents.lNetworkEvents&FD_ACCEPT)
    {
    if(NetworkEvent.iErrorCode[FD_ACCEPT_BIT]!=0)
    {
    printf("FD_ACCEPT failed with error%d\n", NetWorkEvent.iErrorCode[FD_ACCEPT_BIT]);
    break;
    }

    //Accept a new connection and it to the socket and event lists
    Accept = accept(SocketArray[Index-WSA_WAIT_EVENT_0],NULL, NULL);

    //We can not process more than WSA_MAXIMUM_WAIT_EVENTS sockets, so close the accepted socket
    if(EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
    {
    printf("Too many connecttions");
    closesocket(Accept);
    break;
    }

    NewEvent = WSACreateEvent();

    WSAEventSelect(Accept, NewEvent, FD_READ|FD_WRITE|FD_CLOSE);

    Event[EventTotal] = NewEvent;
    Socket[EventTotal] = Accept;
    EventTotal++;

    printf("socket &d connected\n",ACCept);
    }

    //Process FD_READ notification
    if(NewWorkEvent.iErrorCode[FD_READ_BIT]!0)
    {
    if(NetworkEvents.iErrorCode[FD_READ_BIT]!=0)
    {
    printf("FD_READ failed with error %dn", NetworkEvent.iErrorCode[FD_READ_BIT]);
    break;

    }

    //Read data from socket
    recv(Socket[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer),0);
    }

    //Process FD_WRITE notification
    if(NetworkEvents.lNetworkEvents&FD_WRITE)
    {
    if(NetworkEvent.iErrorCode[FD_WRITE_BIT]!=0)
    {
    printf("FD_WRITE failed with error %d\n",
    NetworkEvents.iErrorCode[FD_WRITE_BIT]);
    break;
    }

    send(Socket[Index - WSA_WAIT_EVENT_0], buffer, sizeof(buffer),0);
    }

    if(NetworkEvents.lNetworkEvents&FD_CLOSE)
    {
    if(NetworkEvent.iErrorCode[FD_CLOSE_BIT]!=0)
    {
    printf("FD_CLOSE failed with error &d\n",
    NetworkEvents.iErrorCode[FD_CLOSE_BIT]);
    break;
    }
    }

    closesocket(Socket[index - WSA_WAIT_EVET_0]);

    //Remove socket and associated event from the socket and evnet array and decrement eventtatal
    CompressArrays(Event, socket,&EventTotal);
    }
    }


    收藏到:Del.icio.us