找出套接字的传输类型

Find out transport type for socket

我目前正在努力寻找 C 中 inet/inet6 套接字的 ip、端口和传输类型。

问题是我有一个类似

的socket fd
int s = socket( ... );
bind(s, soa, soa_len);

现在,我得到了s,想知道它绑定到哪个Transport/Interface/Port。 通过

接口和端口很简单
struct sockaddr_storage sa = {};:w
getsockname(s, (struct sockaddr*) &sa, sizeof(sa));
/* parse the fields of sa depending on sa.sa_family */

但是,我想不出一种方法来确定 s 是 TCP 还是 UDP 套接字 - 但是它必须以某种方式关联 - 所以:

如何找出 s 使用的传输协议?

按照 man 7 socket 手册页中的说明使用 getsockopt(descriptor, SO_TYPE, ...)。例如:

#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>

int socket_type(const int fd)
{
    int        type = -1;
    socklen_t  typelen = sizeof type;

    if (fd == -1) {
        errno = EINVAL;
        return -1;
    }
    if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &typelen) == -1)
        return -1;

    errno = 0;
    return type;
}

对于 TCP(AF_INETAF_INET6 套接字系列),这将 return SOCK_STREAM;对于 UDP,SOCK_DGRAM