如何确定打开套接字是TCP还是unix域套接字?

时间:2014-05-21 00:08:28

标签: sockets tcp unix-socket

我的代码通过了一个打开的套接字。此套接字可以是TCP套接字(AF_INET)或Unix域套接字(AF_UNIX)。

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

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

getsockopt似乎允许获取套接字的类型(例如SOCK_STREAM等),但不允许获取域名。

对于OSX上的unix域套接字,

getsockname将返回零长度,但这正式为bug,Linux行为为different

2 个答案:

答案 0 :(得分:1)

getsockname()是唯一的跨平台套接字API,用于查询套接字的本地绑定地址,从而查询其地址族。

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

答案 1 :(得分:1)

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