问题描述
我正在尝试创建一个客户端应用程序,该客户端应用程序将使用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()
的返回值?