OS X getsockopt:无SO_协议

OS X getsockopt:无SO_协议,c,linux,macos,sockets,getsockopt,C,Linux,Macos,Sockets,Getsockopt,OSX不提供允许调用者“…以整数形式检索套接字类型”的SO_协议socket选项() 换句话说,以下程序在linux下构建和工作,但不会在OS X下编译: #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char **argv) {

OSX不提供允许调用者“…以整数形式检索套接字类型”的
SO_协议
socket选项()

换句话说,以下程序在linux下构建和工作,但不会在OS X下编译:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{
    int c, s, type, len;
    len = sizeof(type);

    s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s < 0)
    {  
        fprintf(stderr, "socket kaboom: %s\n", strerror(errno));
        return 1;
    }
    if (getsockopt(s, SOL_SOCKET, SO_PROTOCOL, &type, &len) < 0)
    {  
        fprintf(stderr, "getsosockopt kaboom: %s\n", strerror(errno));
        return 1;
    }
    printf("socket type: %d\n", type);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
内部c,s,类型,len;
len=sizeof(类型);
s=套接字(PF_INET、SOCK_STREAM、IPPROTO_TCP);
如果(s<0)
{  
fprintf(标准,“套接字空间:%s\n”,strerror(errno));
返回1;
}
if(getsockopt(s、SOL_套接字、SO_协议、类型和len)<0)
{  
fprintf(stderr,“getsosockopt kaboom:%s\n”,strerror(errno));
返回1;
}
printf(“套接字类型:%d\n”,类型);
返回0;
}

如何在OS X下实现这一点?

标准的
SO_TYPE
socket选项应该足够了,它返回
SOCK_STREAM
(对应于TCP)和
SOCK_DGRAM
(对应于UDP)等值。使用SCTP时,
SOCK\u流
可能对应于TCP或SCTP,因此_协议
有助于区分它们,但MacOS X不支持SCTP


Unix域套接字不使用协议号;因此,
SO\u TYPE
也是正确的选择。

在我看来,OSX似乎不支持这种功能。您需要它做什么?您还记得在调用
socket(2)
时创建套接字所使用的协议吗?
所以\u protocol
不是。在查明套接字是TCP还是UDP之后,您打算做什么?如何区分使用SOCK_流打开的Unix域套接字和使用SOCK_流打开的TCP套接字?这似乎是一个不同的问题,但标准仅提供getsockname()和getpeername(),这仅在套接字分别绑定或连接时才起作用。您还可以使用这样一个事实,即只有Unix域套接字可以发送和接收数据,而不必绑定到地址。SO_域套接字选项并非无处不在。