微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用ConnectEx + IOCP时提取本地终结点信息IP地址和端口

如何解决使用ConnectEx + IOCP时提取本地终结点信息IP地址和端口

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

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

解决方法

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

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

其中 m_Socket 是我在客户端的连接套接字。 它有效,然后我可以通过 ::getsockname() 获取本地名称,如下所示:

#define GoClearStruct(Struct)   memset(&Struct,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() 的返回值?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。