【问题标题】:OS X getsockopt: no SO_PROTOCOLOS X getsockopt:没有 SO_PROTOCOL
【发布时间】:2014-08-16 14:55:51
【问题描述】:

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 下如何做到这一点?

【问题讨论】:

  • 在我看来 OS X 似乎不支持这个。你需要这个做什么?你能记住你在调用socket(2)时使用了什么协议来创建套接字吗?
  • SO_PROTOCOL 不是standard。查出一个socket是TCP还是UDP之后你打算怎么做?

标签: c linux macos sockets getsockopt


【解决方案1】:

标准的SO_TYPE 套接字选项,返回值如SOCK_STREAM(对应于TCP)和SOCK_DGRAM(对应于UDP)就足够了。对于 SCTP,SOCK_STREAM 可能对应于 TCP 或 SCTP,SO_PROTOCOL 有助于区分它们,但 MacOS X 不支持 SCTP。

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

【讨论】:

  • 如何区分使用 SOCK_STREAM 打开的 Unix 域套接字和使用 SOCK_STREAM 打开的 TCP 套接字?
  • 这似乎是一个不同的问题,但标准只提供了getsockname() 和getpeername(),它们仅在套接字被绑定或连接时才有效。您还可以使用这样一个事实,即只有 Unix 域套接字可以发送和接收数据而无需绑定到地址。 SO_DOMAIN 套接字选项并非无处不在。
猜你喜欢
  • 2010-10-09
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 2023-04-02
  • 2012-06-08
  • 2010-09-08
  • 2015-03-07
相关资源
最近更新 更多