如何使用IOCP获取客户端的真实IP地址和端口?

如何使用IOCP获取客户端的真实IP地址和端口?

问题描述:

我需要服务器端的客户端IP地址和端口号。使用IOCP在C++上编写的服务器,所以我不接受客户端,我创建了新的套接字,然后在此套接字上接受(AcceptEx)客户端。并因为它struct sockaddr_in不正确。如何使用IOCP获取客户端的真实IP地址和端口?

我该怎么做?

谢谢!

AcceptEx可能会返回您和您的对端地址(TCP端口的TCP套接字)。

BOOL AcceptEx(
    __in SOCKET sListenSocket, 
    __in SOCKET sAcceptSocket, 
    __in PVOID lpOutputBuffer, 
    __in DWORD dwReceiveDataLength, 
    __in DWORD dwLocalAddressLength, 
    __in DWORD dwRemoteAddressLength, 
    __out LPDWORD lpdwBytesReceived, 
    __in LPOVERLAPPED lpOverlapped 
); 

应指定lpOutputBuffer指向一个缓冲区大小足以容纳2返回的地址,然后。应该将dwLocalAddressLengthdwRemoteAddressLength设置为缓冲区中保留的地址大小。

根据MSDN单个地址所需的缓冲器大小(AcceptEx功能)是sizeof(SOCKADDR_IN) + 16

dwLocalAddressLength [in] 

The number of bytes reserved for the local address information. This value must be at least 16 bytes more than the maximum address 

长度用于在使用的传输协议。

当然,缓冲区必须对I/O持续时间有效。你可以把它放在你的OVERLAPPED结构里面。事情是这样的:

struct OverlappedAccept 
    :public OVERLAPPED 
{ 
    // some context information that you need 
    // ... 

    // Buffer for addresses 
    struct { 
     BYTE m_pLocal[sizeof(SOCKADDR_IN) + 16]; 
     BYTE m_pRemote[sizeof(SOCKADDR_IN) + 16]; 
    } m_Bufs; 
}; 


// start accept operation 
OverlappedAccept* pOver = /* ... */; 

BOOL bRet = AcceptEx(
    hSockListen, 
    hSockNew, 
    &pOver->m_Bufs, 
    0, 
    sizeof(pOver->m_Bufs.m_pLocal), 
    sizeof(pOver->m_Bufs.m_pRemote), 
    &dwBytes, 
    pOver); 

在我之后/ O有(成功)完成后,您可能会收到地址:

sockaddr *pLocal = NULL, *pRemote = NULL; 
int nLocal = 0, nRemote = 0; 
GetAcceptExSockAddrs(
    &pOver->m_Bufs, 
    0, 
    sizeof(pOver->m_Bufs.m_pLocal), 
    sizeof(pOver->m_Bufs.m_pRemote), 
    &pLocal, 
    &nLocal, 
    &pRemote, 
    &nRemote);