大致代码如下:
SOCKET acsocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0, 0, WSA_FLAG_OVERLAPPED);
BYTE acbuff[2 * (sizeof(SOCKADDR_IN) + 16)];
AcceptEx(listener, acsocket, acbuff, 0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN), ...);
WSAWaitForMultipleEvents(...);
SOCKADDR *pLocalSockaddr, *pRemoteSockaddr;
INT LocalSockaddrLength, RemoteSockaddrLength;
GetAcceptExSockaddrs(acbuff,  0, 16 + sizeof(SOCKADDR_IN), 16 + sizeof(SOCKADDR_IN),
&pLocalSockaddr, &LocalSockaddrLength, &pRemoteSockaddr, &RemoteSockaddrLength);
//GetAcceptExSockaddrs调用成功,可以取得远程地址,但对acsocket调用getpeername就失败,
WSAGetLastError等于WSAENOTCONN,表面意思是连接未建立,其实不是,这个SOCKET既能接收数据,
又能发送数据,肯定是连接了的。这样有个问题就是,如果我需要在多个地方显示远程地址,
我还得把GetAcceptExSockaddrs获取的远程地址找个地方保存起来,而WSAAccept得到的SOCKET
就没这个问题,随时需要随时调用getpeername函数来获取即可,请问这是为什么,能否解决?

解决方案 »

  1.   

    在widows 2000下无法使用getpeername/getsockname.
      

  2.   

    MSDN总有给人暗藏玄机的意味:
    On Windows XP and later, once the AcceptEx function completes and the SO_UPDATE_ACCEPT_CONTEXT option is set on the accepted socket, the local address associated with the accepted socket can also be retrieved using the getsockname function. Likewise, the remote address associated with the accepted socket can be retrieved using the getpeername function.
      

  3.   

    当是就为了个问题,查了我好长好长时间,因为我本机是windows 2003,而用户用的是windows 2000 advance server,查看过所有API都是支持的.反复反复地看MSDN,最后才发现,上面是如此写的,当时那汗可是豆大豆大的.害我还强制要求客户换掉操作系统.
      

  4.   

    真是这样吗?回去试试,我觉得这句应该写在MSDN的显注位置,否则注意不到。
      

  5.   

    在widows 2000下无法使用getpeername/getsockname. 这句是错的,to unsigned
    就在
    On Windows XP and later, once the AcceptEx function completes and the SO_UPDATE_ACCEPT_CONTEXT option is set on the accepted socket, the local address associated with the accepted socket can also be retrieved using the getsockname function. Likewise, the remote address associated with the accepted socket can be retrieved using the getpeername function. 这些语句的下面,有一段代码,你看到没有,加上这段代码就行了。这个我试过了。
      

  6.   

    不会说的是这段代码吧?
     err = setsockopt( sAcceptSocket, 
        SOL_SOCKET, 
        SO_UPDATE_ACCEPT_CONTEXT, 
        (char *)&sListenSocket, 
        sizeof(sListenSocket) );
    我一直有用,但是似乎并没有效果,而我只能通过GetAcceptExSockaddrs取得相应的信息,并组存于连接上下文结构当中.(Windows 2000 Advance Server + SP4)
      

  7.   

    但是对于Winxp和Win2k3就一切正常.Vista/Win2k8未测试,应该也不会有问题.