因为需要这个函数来对传递的接收调用的缓冲区内的本地及远程地址进行解码,所有这个函数是AcceptEx的辅助函数。单个缓冲区不仅容纳连接的本地及远程地址,还容纳连接上收到的任何数据。指明要接收的任何数据将始终放在缓冲区的开始部位,地址紧随其后。不过这个地址是打包形式的地址,GetAcceptExSockaddrs函数将把他们拆开放到适当的相应地址族的结构中。

  1. void GetAcceptExSockaddrs( 
  2.   __in          PVOID lpOutputBuffer, 
  3.   __in          DWORD dwReceiveDataLength, 
  4.   __in          DWORD dwLocalAddressLength, 
  5.   __in          DWORD dwRemoteAddressLength, 
  6.   __out         LPSOCKADDR* LocalSockaddr, 
  7.   __out         LPINT LocalSockaddrLength, 
  8.   __out         LPSOCKADDR* RemoteSockaddr, 
  9.   __out         LPINT RemoteSockaddrLength 
  10. ); 

前4个参数与AcceptEx调用中的参数一样,而且它们必须和传递到AcceptEx中的数值相匹配。

演示AcceptEx调用后,调用GetAcceptExSockaddrs函数:

  1. //buf和buflen已在前面定义过‘ 
  2. SOCKADDR *lpLocalSockaddr = NULL, 
  3.          *lpRemoteSockaddr = NULL; 
  4. int LocalSockaddrLen = 0, 
  5.     RemoteSockaddrLen = 0; 
  6. LPFN_GETACCEPTEXSOCKADDRS lpfnGetAcceptExSockaddrs = NULL; 
  7.  
  8. //加载GetAcceptExSockaddrs函数 
  9. lpfnGetAcceptExSockaddrs(buf, 
  10.                          buflen-((sizeof(SOCKADDR_IN)+16)*2), 
  11.                          sizeof(SOCKADDR_IN)+16, 
  12.                          sizeof(SOCKADDR_IN)+16, 
  13.                          &lpLocalSockaddr, 
  14.                          &LocalSockaddrLen, 
  15.                          &lpRemoteSockaddr, 
  16.                          &RemoteSockaddrLen);  

函数完成之后,lpLocalSockaddr和lpRemoteSockaddr参数指向指定的缓冲区中的某个位置,在那里套接字地址已被解包成正确的套接字地址结构。