2014-05-21 75 views
1

我的代码通过一个开放的套接字。此套接字可以是TCP套接字(AF_INET)或Unix域套接字(AF_UNIX)。如何确定打开的套接字是TCP还是unix域套接字?

根据套接字的域,它需要以不同的方式处理。特别是如果套接字绑定到一个地址,那么我可能想要以不同的方式传入连接。

确定我传递的套接字是否是unix域套接字或TCP套接字的最佳方法是什么?该解决方案至少需要在OS X和Linux上运行。

getsockopt似乎允许获得插座的类型(例如SOCK_STREAM等),但不是域。

getsockname将为OSX上的unix域套接字返回零长度,但这是正式的bug,而Linux的行为是different

回答

1

getsockname返回的struct sockaddr的第一个成员是sa_family,只是针对符号常量进行测试。 OSX上的错误可让您在返回的地址结构为零字节时假定unix域,对于其他平台和域,只需检查返回的结构。

1

getsockname()是唯一的跨平台套接字API来查询套接字的本地绑定地址,因此它的地址系列。

在Windows上,至少可以使用getsockopt(SOL_SOCKET, SO_PROTOCOL_INFO)检索WSAPROTOCOL_INFO结构,该结构具有iAddressFamily字段。也许在其他操作系统上有类似的平台特定的API。