서버에서 클라이언트의 IP 주소와 포트를 가져갈 필요가 있습니다. 서버가 C++로 작성된 IOCP를 사용하여 클라이언트를 받아 들일 수 없으므로 새 소켓을 작성한 다음 준비된 소켓에서 AcceptEx 클라이언트를 승인합니다. 그리고 그것 때문에 struct sockaddr_in이 올바르지 않습니다.IOCP를 사용하여 클라이언트의 실제 IP 주소 및 포트를 얻는 방법은 무엇입니까?
어떻게하면됩니까?
감사합니다.
서버에서 클라이언트의 IP 주소와 포트를 가져갈 필요가 있습니다. 서버가 C++로 작성된 IOCP를 사용하여 클라이언트를 받아 들일 수 없으므로 새 소켓을 작성한 다음 준비된 소켓에서 AcceptEx 클라이언트를 승인합니다. 그리고 그것 때문에 struct sockaddr_in이 올바르지 않습니다.IOCP를 사용하여 클라이언트의 실제 IP 주소 및 포트를 얻는 방법은 무엇입니까?
어떻게하면됩니까?
감사합니다.
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
를 지정해야합니다. dwLocalAddressLength
및 dwRemoteAddressLength
은 버퍼에 예약 된 주소 크기로 설정해야합니다. 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는 (성공적으로)를 사용하면 주소를 얻을 수 있습니다 완료