代码之家  ›  专栏  ›  技术社区  ›  Michael Beer

查找插座的传输类型

  •  1
  • Michael Beer  · 技术社区  · 6 年前

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

    问题是我有一个类似fd的插座

    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 回复  |  直到 6 年前
        1
  •  1
  •   Nominal Animal    6 年前

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