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

问题是我有一个 socket fd像

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

现在,我得到了s并想找出它绑定(bind)到哪个Transport/Interface/Port。
接口(interface)和端口很容易通过
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使用的传输协议(protocol)?

最佳答案

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

#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

关于c - 找出 socket 的运输类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50379119/

10-11 19:02