天天看點

在完成端口中使用GetAcceptExSockaddrs

和accept不一樣的是,AcceptEx是非阻塞的,而且在接受用戶端請求前,可以發起n個AcceptEx,當連接配接建立時(三次握手結束時刻),會有一個接受完成包加入IOCP的完成隊列,按照MSDN上說,就可以在工作線程中,通過調用GetAcceptExSockaddrs解析(parse)1)用戶端發送的第一塊資料,2)本地(Server)套接字位址,3)遠端(Client)套接字位址

工作線程:

      // 取得客戶位址

      int nLocalLen, nRmoteLen;

      LPSOCKADDR pLocalAddr, pRemoteAddr;

      m_lpfnGetAcceptExSockaddrs(

       pBuffer->buff,

       pBuffer->nLen - ((sizeof(sockaddr_in) + 16) * 2),

       sizeof(sockaddr_in) + 16,

       (SOCKADDR **)&pLocalAddr,

       &nLocalLen,

       (SOCKADDR **)&pRemoteAddr,

       &nRmoteLen);

正如上面說當AcceptEx完成時,并且SO_UPDATE_ACCEPT_CONTEXT選項被設定時,也可以通過getsockname傳回local address ,通過調用getpeername傳回remote address

設定SO_UPDATE_ACCEPT_CONTEXT原因是:

When the AcceptEx function returns, the socket sAcceptSocket is in the default state for a connected socket. The socket sAcceptSocket does not inherit the properties of the socket associated with sListenSocket parameter until SO_UPDATE_ACCEPT_CONTEXT is set on the socket.

設定:

Use the setsockopt function to set the SO_UPDATE_ACCEPT_CONTEXT option, specifying sAcceptSocket as the socket handle and sListenSocket as the option value.

For example:

繼續閱讀