确定未绑定套接字的地址族

Inc*_*bus 1 c++ sockets networking bind winsock

当我尝试绑定我的套接字时,我需要在addrinfo/sockaddr-structure中指定地址系列,我将其传递给对bind()的调用,否则将获得winsock错误10047(协议族不支持的地址族).

如果我创建了一个不知道其地址族的套接字怎么办...怎样才能得到该套接字的地址族,所以我可以绑定它?

getsockname仅适用于绑定套接字:/ ...

我不想强迫我的函数调用者将地址族传递给我的函数,特别是如果她/他/它在创建她/他的套接字时使用AF_UNSPEC/PF_UNSPEC

(例如SOCKET sock = socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);)

Inc*_*bus 5

由于我使用Winsock,我确实搜索了MSDN一段时间,并找到了WSADuplicateSocket.

WSAPROTOCOL_INFO proto;
WSADuplicateSocket(Socket, GetCurrentProcessId(), &proto);
SocketAF = proto.iAddressFamily;
Run Code Online (Sandbox Code Playgroud)

适用于Windows机器......

  • 此外,带有SO_PROTOCOL_INFO的getsockopt可用于检索相同的信息. (3认同)