zoukankan      html  css  js  c++  java
  • 各模型关闭套接字时机

    1.select

    readfds集合有下列事件发生时,会被标识:

    数据可读;连接已经关闭、重启或者中断;如果listen已经调用,并且有一个连接未决,accept可以成功。

    select函数会返回,有多少个socket发生了事件。

    要关闭一个套接字时,判断select返回>0,然后recv套接字,出错,就代表这个socket可以closesocket了。

    2.WSAAsyncSelect

    int WSAAsyncSelect(
    SOCKET s,
    HWND hWnd,
    unsigned int wMsg,
    long lEvent
    );

     第四个参数lEvent,可以设置FD_CLOSE

    当有socket被关闭时,会发送一条这个消息

    3.WSAEventSelect

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

    第三个参数也可以设置FD_CLOSE

    然后

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

    的第三个参数指明了是不是发生了FD_CLOSE

    WSANETWORKEVENTS event;

    ::WSAEnumNetworkEvents(pSocket->s, pSocket->event, &event);

    else if(event.lNetworkEvents & FD_CLOSE) // 套节字关闭
    {
    m_fnNotifyProc(pSocket, pThread, NC_DISCONNECT);
    break;
    }

    4.重叠IO

    BOOL WSAGetOverlappedResult(
    SOCKET s,
    LPWSAOVERLAPPED lpOverlapped,
    LPDWORD lpcbTransfer,
    BOOL fWait,
    LPDWORD lpdwFlags
    );

     这个函数出错了,就代表socket出错了

    5.IO完成端口

    BOOL GetQueuedCompletionStatus(
    HANDLE CompletionPort,
    LPDWORD lpNumberOfBytes,
    PULONG_PTR lpCompletionKey,
    LPOVERLAPPED* lpOverlapped,
    DWORD dwMilliseconds
    );

     这个MSDN上就有解释

    If a socket handle associated with a completion port is closed, GetQueuedCompletionStatus returns ERROR_SUCCESS, with *lpOverlapped non-NULL and lpNumberOfBytes equal zero.

    顺便说下,这5种模型有意思的区别

    以本文顺序来说

    前三种,是等待事件,然后再发送一个IO(recv,accept)。

    后二种,是先发一个IO,再等待事件,表示IO完成了。

  • 相关阅读:
    (转载)李开复:我在硅谷看到的最前沿科技趋势
    1019. 数字黑洞 (20)
    1018. 锤子剪刀布 (20)
    1017. A除以B (20)
    1016. 部分A+B (15)
    1015. 德才论 (25)
    1013. 数素数 (20)
    1014. 福尔摩斯的约会 (20)
    1012. 数字分类 (20)
    1011. A+B和C (15)
  • 原文地址:https://www.cnblogs.com/ywledoc/p/2794720.html
Copyright © 2011-2022 走看看