【问题标题】:How do I determine whether open socket is TCP or unix domain socket?如何确定打开的套接字是 TCP 还是 unix 域套接字?
【发布时间】:2014-07-09 10:20:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sockets tcp unix-socket


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      getsockname() 是唯一一个跨平台套接字 API 来查询套接字的本地绑定地址,以及它的地址族。

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

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 2013-02-05
        • 2015-07-20
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多