c - OS X getsockopt : no SO_PROTOCOL

标签 c linux macos sockets getsockopt

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/

相关文章:

c - 无法将 libavformat/ffmpeg 与 x264 和 RTP 同步

c - 如何将文件中的单词分配给 C 中的二维字符串数组

linux - 主从 Memcache 复制

java - 如何使 Java 应用程序出现在 Mac OS X 停靠栏中并带有图标

java - 64 位 Java VM 运行应用程序速度慢 10 倍

c - 程序运行,但结果错误......是一个找到矩形三角形缺失边并找到其角度的程序

linux - 将 preempt_notifier 附加到 Linux 中的用户进程

c++ - 使用 Linux C 代码和头文件编译 Windows DLL

macos - 操作系统/DiskUtil : Create auto-resizing encrypted Disc Image

c - 隐藏内部类型