和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: