找出套接字的传输类型

时间:2018-05-16 20:06:29

标签: c sockets unix posix

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

问题是我得到了一个像

这样的套接字
int s = socket( ... );
bind(s, soa, soa_len);

现在,我得到s并想知道它绑定到哪个传输/接口/端口。 接口和端口很容易通过

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使用的传输协议?

1 个答案:

答案 0 :(得分:1)

使用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套接字系列),这将返回SOCK_STREAM;对于UDP,SOCK_DGRAM