我的代码通过了一个打开的套接字。此套接字可以是TCP套接字(AF_INET
)或Unix域套接字(AF_UNIX
)。
根据套接字的域,需要以不同方式处理。特别是如果套接字绑定到一个地址,那么我可能希望以不同的方式accept
传入连接。
确定我传递的套接字是unix域套接字还是TCP套接字的最佳方法是什么?该解决方案至少需要在OS X和Linux上运行。
getsockopt
似乎允许获取套接字的类型(例如SOCK_STREAM
等),但不允许获取域名。
答案 0 :(得分:1)
getsockname()
是唯一的跨平台套接字API,用于查询套接字的本地绑定地址,从而查询其地址族。
在Windows上,至少可以使用getsockopt(SOL_SOCKET, SO_PROTOCOL_INFO)
检索WSAPROTOCOL_INFO
结构,其中包含iAddressFamily
字段。也许在其他操作系统上有类似的特定于平台的API。
答案 1 :(得分:1)
struct sockaddr
返回的getsockname
的第一个成员是sa_family
,只是针对符号常量进行测试。 OSX上的错误允许您在返回的地址结构为零字节时假设unix域,对于其他平台和域,只需检查返回的结构。