Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何确定开放套接字是TCP还是unix域套接字?_Sockets_Tcp_Unix Socket - Fatal编程技术网

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

Sockets 如何确定开放套接字是TCP还是unix域套接字?,sockets,tcp,unix-socket,Sockets,Tcp,Unix Socket,我的代码通过一个打开的套接字传递。此套接字可以是TCP套接字(AF_INET)或Unix域套接字(AF_Unix) 根据套接字的域,需要以不同的方式处理它。特别是,如果套接字绑定到一个地址,那么我可能希望以不同的方式接受传入连接 确定我传递的套接字是unix域套接字还是TCP套接字的最佳方法是什么?该解决方案至少需要在OSX和Linux上运行 getsockopt似乎允许获取套接字的类型(例如SOCK\u流等),但不允许获取域 getsockname将为OSX上的unix域套接字返回一个零长度,

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

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

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

getsockopt
似乎允许获取套接字的类型(例如
SOCK\u流
等),但不允许获取域

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

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


至少在Windows上,您可以使用
getsockopt(SOL\u SOCKET,SO\u PROTOCOL\u INFO)
检索结构,该结构具有
iadressfamily
字段。其他操作系统上可能也有类似的特定于平台的API。

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