OS X getsockopt:无SO_协议
OSX不提供允许调用者“…以整数形式检索套接字类型”的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) {
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_域套接字选项并非无处不在。