【问题标题】:Extract local endpoint info (IP address and port) when using ConnectEx + IOCP使用 ConnectEx + IOCP 时提取本地端点信息(IP 地址和端口)
【发布时间】:2020-09-19 16:52:12
【问题描述】:

我正在尝试创建一个使用 IOCP 来使用异步 IO 的客户端应用程序。我已经做过类似的服务器应用程序并且它工作正常,但是我找不到任何关于如何从通过ConnectEx API 连接的套接字中提取本地端点信息的信息。

对于服务器套接字,文档指出有关本地和远程端点的信息将成为发送到AcceptEx 的缓冲区的一部分。 ConnectEx 中没有类似的东西。我还尝试通过getsockname 提取本地端点信息,但是这返回了一些垃圾值。在调用getsockname 之前,我也尝试使用setsockopt(clientSocket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, ...),但结果与没有它相同。有没有办法做到这一点,还是我误解了什么?

【问题讨论】:

    标签: c sockets winsock2 iocp


    【解决方案1】:

    我也使用ConnectEx() 函数,当异步Connect 操作在IOCP 上完成时,我通常会调用

    ::setsockopt(m_Socket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, nullptr, 0);
    

    其中 m_Socket 是我在客户端的连接套接字。 它可以工作,然后我可以像这样通过::getsockname() 获取本地名称:

    #define GoClearStruct(Struct)   memset(&Struct, 0, sizeof(Struct))
    
    sockaddr_storage _AddrStorage;
    sockaddr *_Addr = (sockaddr *)&_AddrStorage;
    int _AddrLen = sizeof(_AddrStorage);
    GoClearStruct(_AddrStorage);
    if (::getsockname(m_Socket, _Addr, &_AddrLen) != SOCKET_ERROR) 
    {
        // extract the local name
    }
    

    在你的代码中很难找出问题所在,你能从中分享更多吗? 你检查::setsockopt()::getsockname()的返回值了吗?

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2021-12-11
      • 2014-12-29
      • 1970-01-01
      • 2014-03-14
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多