首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用IOCP获取客户端真实ip地址和端口?

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

Stack Overflow用户
提问于 2012-04-05 19:43:39
回答 1查看 867关注 0票数 1

我需要在服务器中获取客户端的ip地址和端口。服务器是用IOCP在C++上写的,所以我不接受客户端,我创建了一个新的socket,然后在这个现成的socket上接受(AcceptEx)客户端。正因为如此,结构sockaddr_in是不正确的。

我该怎么做呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-05 19:57:06

AcceptEx可能会同时返回您的地址和对等地址( TCP套接字的ip+port)。

代码语言:javascript
复制
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。该值必须至少比最大地址多16个字节

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

当然,缓冲区必须在I/O持续时间内有效。您可以将其放入您的OVERLAPPED结构中。如下所示:

代码语言:javascript
复制
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 (成功)完成后,您可能会获得以下地址:

代码语言:javascript
复制
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);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10027940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档