我需要在服务器中获取客户端的ip地址和端口。服务器是用IOCP在C++上写的,所以我不接受客户端,我创建了一个新的socket,然后在这个现成的socket上接受(AcceptEx)客户端。正因为如此,结构sockaddr_in是不正确的。
我该怎么做呢?
谢谢!
发布于 2012-04-05 19:57:06
AcceptEx可能会同时返回您的地址和对等地址( TCP套接字的ip+port)。
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。该值必须至少比最大地址多16个字节
正在使用的传输协议的长度。
当然,缓冲区必须在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);https://stackoverflow.com/questions/10027940
复制相似问题