OS X 不提供 SO_PROTOCOL
套接字选项,该选项允许调用者“...将套接字类型检索为整数”。 ( http://linux.die.net/man/7/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;
}
如何在 OS X 下完成这个?
最佳答案
标准的SO_TYPE
套接字选项,它返回值如SOCK_STREAM
(对应TCP)和SOCK_DGRAM
(对应UDP),应该足够了.对于 SCTP,SOCK_STREAM
可能对应于 TCP 或 SCTP,SO_PROTOCOL
有助于区分它们,但 MacOS X 不支持 SCTP。
Unix 域套接字不使用协议(protocol)号;因此,SO_TYPE
也是正确的选择。
关于c - OS X getsockopt : no SO_PROTOCOL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24418930/