2012-04-05 2 views
1

서버에서 클라이언트의 IP 주소와 포트를 가져갈 필요가 있습니다. 서버가 C++로 작성된 IOCP를 사용하여 클라이언트를 받아 들일 수 없으므로 새 소켓을 작성한 다음 준비된 소켓에서 AcceptEx 클라이언트를 승인합니다. 그리고 그것 때문에 struct sockaddr_in이 올바르지 않습니다.IOCP를 사용하여 클라이언트의 실제 IP 주소 및 포트를 얻는 방법은 무엇입니까?

어떻게하면됩니까?

감사합니다.

답변

5

AcceptEx은 귀하와 귀하의 동료 주소 (ip + 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를 지정해야합니다. 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 구조 안에 넣을 수 있습니다. 이런 식으로 뭔가 :

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); 
:

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); 

의 I 후/O는 (성공적으로)를 사용하면 주소를 얻을 수 있습니다 완료