[英]How to get client real ip-address and port using IOCP?
我需要在服務器中獲取客戶端的 ip 地址和端口。 服務器使用 IOCP 寫在 C++ 上,所以我不接受客戶端,我創建新的套接字,然后在這個准備好的套接字上接受 (AcceptEx) 客戶端。 因為它 struct sockaddr_in 是不正確的。
我怎樣才能做到這一點?
謝謝!
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
指向一個大小足以容納 2 個返回地址的緩沖區。 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
結構中。 像這樣:
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(成功)完成后,您可能會獲得以下地址:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.