精华内容
下载资源
问答
  • sockaddr_in
    2021-05-23 08:33:02

    我知道sockaddr_in用于IPv4,sockaddr_in6用于IPv6.我的困惑是sockaddr和sockaddr_in [6]之间的区别.

    有些函数接受sockaddr,有些函数接受sockaddr_in或sockaddr_in6,所以:

    >规则是什么?

    >为什么需要两种不同的结构?

    并且因为sizeof(sockaddr_in6)> sizeof(sockaddr)== sizeof(sockaddr_in).

    >这是否意味着如果我们需要支持ipv4和ipv6,我们应该总是使用sockaddr_in6在堆栈中分配内存并转换为sockaddr和sockaddr_in?

    一个例子是:我们有一个套接字,我们想得到它的字符串IP地址(它可以是ipv4或ipv6).

    我们先调用getsockname来获取一个addr,然后根据addr.sa_family调用inet_ntop.

    这段代码片段有什么问题吗?

    sockaddr_in6 addr_inv6;

    sockaddr* addr = (sockaddr*)&addr_inv6;

    sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6;

    socklen_t len = sizeof(addr_inv6);

    getsockname(_socket, addr, &len);

    char ipStr[256];

    if (addr->sa_family == AF_INET6)

    {

    inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipStr, sizeof(ipStr));

    // <<<<<<<

    }

    else

    {

    inet_ntop(addr_in->sin_family, &addr_in->sin_addr, ipStr, sizeof(ipStr));

    }

    更多相关内容
  • 主要介绍了Linux C中sockaddrsockaddr_in的区别的相关资料,需要的朋友可以参考下
  • */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; }; /* /usr/include/netinet/in.h */ #ifndef __USE_KERNEL_IPV6_DEFS /* Ditto...

    本文转自https://blog.csdn.net/albertsh/article/details/80991684,简单易懂,赞。

    前言

    最近在学习网络相关的知识,虽然之前代码写了不少,但是长时间不写难免会忘记,简单地复习了一下IO多路复用的方式,对比了解了一下epoll模式和select模式的异同,不过写代码的时候发现,这个socket连接中有几个结构还是挺让人头大的,用着用着突然就强转成其他的类型了,加上年前改了半天IPv6的连接,这几个结构体更加混乱,所以今天角色放到一起,从源码的角度看一下sockaddr、sockaddr_in、sockaddr_in6这三个结构体之间的联系,以及为什么有些情况可以直接强转。

    代码分析

    1. 看一下这三个结构的定义,先说明一下版本,操作系统为CentOS,头文件版本应该挺古老了,在’/usr/include/netinet/in.h’ 中发现版权信息:Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009, 2010,看着很古老,但之后的版本应该没有改动很大吧,反正不太清楚,我们就分析当前这一个版本吧。

      /* /usr/include/bits/socket.h */
      /* Structure describing a generic socket address.  */
      struct sockaddr
      {
       __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
       char sa_data[14];           /* Address data.  */
      };
      
      /* /usr/include/netinet/in.h */
      /* Structure describing an Internet socket address.  */
      struct sockaddr_in
      {
       __SOCKADDR_COMMON (sin_);
       in_port_t sin_port;         /* Port number.  */
       struct in_addr sin_addr;    /* Internet address.  */
      
       /* Pad to size of `struct sockaddr'.  */
       unsigned char sin_zero[sizeof (struct sockaddr) -
                  __SOCKADDR_COMMON_SIZE -
                  sizeof (in_port_t) -
                  sizeof (struct in_addr)];
      };
      
      /* /usr/include/netinet/in.h */
      
      #ifndef __USE_KERNEL_IPV6_DEFS
      
      /* Ditto, for IPv6.  */
      struct sockaddr_in6
      {
       __SOCKADDR_COMMON (sin6_);
       in_port_t sin6_port;        /* Transport layer port # */
       uint32_t sin6_flowinfo;     /* IPv6 flow information */
       struct in6_addr sin6_addr;  /* IPv6 address */
       uint32_t sin6_scope_id;     /* IPv6 scope-id */
      };
      
      #endif /* !__USE_KERNEL_IPV6_DEFS */
      
      
    2. 看到3个结构的定义想到了什么?只是看着有点像吧,真正的区别我们往下看,其中3个结构里都包含了 __SOCKADDR_COMMON 这个宏,我们先把它的定义找到,最后在’usr/inlcue/bits/sockaddr.h’中找到如下代码,

      /* POSIX.1g specifies this type name for the `sa_family' member.  */
      typedef unsigned short int sa_family_t;
      
      /* This macro is used to declare the initial common members
      of the data types used for socket addresses, `struct sockaddr',
      `struct sockaddr_in', `struct sockaddr_un', etc.  */
      
      
      #define __SOCKADDR_COMMON(sa_prefix) \
      
      sa_family_t sa_prefix##family
      
      
      #define __SOCKADDR_COMMON_SIZE  (sizeof (unsigned short int))
      

      由此我们知道,这三个结构的第一个字段都是一个unsigned short int 类型,只不过用宏来定义了三个不同的名字,至此第一个结构就清楚了,在一般环境下(short一般为2个字节),整个结构占用16个字节,变量sa_family占用2个字节,变量sa_data 保留14个字节用于保存IP地址信息。

    3. 接着我们发现第二个结构中还有in_port_tstruct in_addr两个类型没有定义,继续找下去吧,在文件
      ‘/usr/include/netinet/in.h’发现以下定义

      /* Type to represent a port.  */
      typedef uint16_t in_port_t;
      
      /* Internet address.  */
      typedef uint32_t in_addr_t;
      struct in_addr
      {
       in_addr_t s_addr;
      };

      这么看来sockaddr_in这个结构也不复杂,除了一开始的2个字节表示sin_family,然后是2个字节的变量sin_port表示端口,接着是4个字节的变量sin_addr表示IP地址,最后是8个字节变量sin_zero填充尾部,用来与结构sockaddr对齐

    4. 现在我们该分析结构sockaddr_in6了,这里边只有一个未知的结构in6_addr,经过寻找发现其定义也在’/usr/include/netinet/in.h’中

      
      #ifndef __USE_KERNEL_IPV6_DEFS
      
      /* IPv6 address */
      struct in6_addr
      {
       union
       {
           uint8_t __u6_addr8[16];
      
      #if defined __USE_MISC || defined __USE_GNU
      
           uint16_t __u6_addr16[8];
           uint32_t __u6_addr32[4];
      
      #endif
      
       } __in6_u;
      
      #define s6_addr         __in6_u.__u6_addr8
      
      
      #if defined __USE_MISC || defined __USE_GNU
      
      
      # define s6_addr16      __in6_u.__u6_addr16
      
      
      # define s6_addr32      __in6_u.__u6_addr32
      
      
      #endif
      
      };
      
      #endif /* !__USE_KERNEL_IPV6_DEFS */
      

      这个结构看起来有点乱,但是如果抛开其中的预编译选项,其实就是8个字节,用来表示IPV6版本的IP地址,一共128位,只不过划分字节的段数有些不同,每段字节多一点那么段数就少一点,反义亦然。

    5. 那接下来我们整理一下,为了看的清楚,部分结构使用伪代码,不能通过编译,主要是方便对比,整理如下

      /* Structure describing a generic socket address.  */
      struct sockaddr
      {
       uint16 sa_family;           /* Common data: address family and length.  */
       char sa_data[14];           /* Address data.  */
      };
      
      /* Structure describing an Internet socket address.  */
      struct sockaddr_in
      {
       uint16 sin_family;          /* Address family AF_INET */ 
       uint16 sin_port;            /* Port number.  */
       uint32 sin_addr.s_addr;     /* Internet address.  */
       unsigned char sin_zero[8];  /* Pad to size of `struct sockaddr'.  */
      };
      
      /* Ditto, for IPv6.  */
      struct sockaddr_in6
      {
       uint16 sin6_family;         /* Address family AF_INET6 */
       uint16 sin6_port;           /* Transport layer port # */
       uint32 sin6_flowinfo;       /* IPv6 flow information */
       uint8  sin6_addr[16];       /* IPv6 address */
       uint32 sin6_scope_id;       /* IPv6 scope-id */
      };

      这么来看是不是就清晰多了,由此我们发现结构 sockaddrsockaddr_in 字节数完全相同,都是16个字节,所以可以直接强转,但是结构 sockaddr_in6 有28个字节,为什么在使用的时候也是直接将地址强制转化成(sockaddr*)类型呢?

    强转的可能性

    其实sockaddrsockaddr_in 之间的转化很容易理解,因为他们开头一样,内存大小也一样,但是sockaddrsockaddr_in6之间的转换就有点让人搞不懂了,其实你有可能被结构所占的内存迷惑了,这几个结构在作为参数时基本上都是以指针的形式传入的,我们拿函数bind()为例,这个函数一共接收三个参数,第一个为监听的文件描述符,第二个参数是sockaddr*类型,第三个参数是传入指针原结构的内存大小,所以有了后两个信息,无所谓原结构怎么变化,因为他们的头都是一样的,也就是uint16 sa_family,那么我们也能根据这个头做处理,原本我没有看过bind()函数的源代码,但是可以猜一下:

    int bind(int socket_fd, sockaddr* p_addr, int add_size)
    {
        if (p_addr->sa_family == AF_INET)
        {
            sockaddr_in* p_addr_in = (sockaddr_in*)p_addr;
            //...
        }
        else if (p_addr->sa_family == AF_INET6)
        {
            sockaddr_in6* p_addr_in = (sockaddr_in6*)p_addr;
            //...
        }
        else
        {
            //...
        }
    }

    由以上代码完全可以实现IPv4和IPv6的版本区分,所以不需要纠结内存大小的不同

    总结

    1. 通过等价替换的方式我们可以更好的了解sockaddrsockaddr_insockaddr_in6之间的异同。
    2. 网路接口函数针对于IPv4和IPv6虽然有不同的结构,但是接口基本相同,主要是为了用户(开发者)使用方便吧。
    3. 有时间可以看一下bind()accept()等函数,看看其中对于结构的使用到底是怎样的。
    展开全文
  • 接着我们发现第二个结构中还有in_port_t和struct in_addr两个类型没有定义,继续找下去吧,在文件 ‘/usr/include/netinet/in.h’发现以下定义 /* Type to represent a port. */ typedef uint16_t in_port_t; ...

    本文转自:https://blog.csdn.net/albertsh/article/details/80991684

    前言
    最近在学习网络相关的知识,虽然之前代码写了不少,但是长时间不写难免会忘记,简单地复习了一下IO多路复用的方式,对比了解了一下epoll模式和select模式的异同,不过写代码的时候发现,这个socket连接中有几个结构还是挺让人头大的,用着用着突然就强转成其他的类型了,加上年前改了半天IPv6的连接,这几个结构体更加混乱,所以今天角色放到一起,从源码的角度看一下sockaddr、sockaddr_in、sockaddr_in6这三个结构体之间的联系,以及为什么有些情况可以直接强转。

    代码分析
    看一下这三个结构的定义,先说明一下版本,操作系统为CentOS,头文件版本应该挺古老了,在’/usr/include/netinet/in.h’ 中发现版权信息:Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009, 2010,看着很古老,但之后的版本应该没有改动很大吧,反正不太清楚,我们就分析当前这一个版本吧。

    /* /usr/include/bits/socket.h */
    /* Structure describing a generic socket address.  */
    struct sockaddr
    {
     __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
     char sa_data[14];           /* Address data.  */
    };
    
    /* /usr/include/netinet/in.h */
    /* Structure describing an Internet socket address.  */
    struct sockaddr_in
    {
     __SOCKADDR_COMMON (sin_);
     in_port_t sin_port;         /* Port number.  */
     struct in_addr sin_addr;    /* Internet address.  */
    
     /* Pad to size of `struct sockaddr'.  */
     unsigned char sin_zero[sizeof (struct sockaddr) -
                __SOCKADDR_COMMON_SIZE -
                sizeof (in_port_t) -
                sizeof (struct in_addr)];
    };
    
    /* /usr/include/netinet/in.h */
    
    #ifndef __USE_KERNEL_IPV6_DEFS
    
    /* Ditto, for IPv6.  */
    struct sockaddr_in6
    {
     __SOCKADDR_COMMON (sin6_);
     in_port_t sin6_port;        /* Transport layer port # */
     uint32_t sin6_flowinfo;     /* IPv6 flow information */
     struct in6_addr sin6_addr;  /* IPv6 address */
     uint32_t sin6_scope_id;     /* IPv6 scope-id */
    };
    
    #endif /* !__USE_KERNEL_IPV6_DEFS */


    看到3个结构的定义想到了什么?只是看着有点像吧,真正的区别我们往下看,其中3个结构里都包含了 __SOCKADDR_COMMON 这个宏,我们先把它的定义找到,最后在’usr/inlcue/bits/sockaddr.h’中找到如下代码,

    /* POSIX.1g specifies this type name for the `sa_family' member.  */
    typedef unsigned short int sa_family_t;
    
    /* This macro is used to declare the initial common members
    of the data types used for socket addresses, `struct sockaddr',
    `struct sockaddr_in', `struct sockaddr_un', etc.  */
    
    
    #define __SOCKADDR_COMMON(sa_prefix) \
    
    sa_family_t sa_prefix##family
    
    
    #define __SOCKADDR_COMMON_SIZE  (sizeof (unsigned short int))
    


    由此我们知道,这三个结构的第一个字段都是一个unsigned short int 类型,只不过用宏来定义了三个不同的名字,至此第一个结构就清楚了,在一般环境下(short一般为2个字节),整个结构占用16个字节,变量sa_family占用2个字节,变量sa_data 保留14个字节用于保存IP地址信息。

    接着我们发现第二个结构中还有in_port_t和struct in_addr两个类型没有定义,继续找下去吧,在文件
    ‘/usr/include/netinet/in.h’发现以下定义

    /* Type to represent a port.  */
    typedef uint16_t in_port_t;
    
    /* Internet address.  */
    typedef uint32_t in_addr_t;
    struct in_addr
    {
     in_addr_t s_addr;
    };
    


    这么看来sockaddr_in这个结构也不复杂,除了一开始的2个字节表示sin_family,然后是2个字节的变量sin_port表示端口,接着是4个字节的变量sin_addr表示IP地址,最后是8个字节变量sin_zero填充尾部,用来与结构sockaddr对齐

    现在我们该分析结构sockaddr_in6了,这里边只有一个未知的结构in6_addr,经过寻找发现其定义也在’/usr/include/netinet/in.h’中

    #ifndef __USE_KERNEL_IPV6_DEFS
    
    /* IPv6 address */
    struct in6_addr
    {
     union
     {
         uint8_t __u6_addr8[16];
    
    #if defined __USE_MISC || defined __USE_GNU
    
         uint16_t __u6_addr16[8];
         uint32_t __u6_addr32[4];
    
    #endif
    
     } __in6_u;
    
    #define s6_addr         __in6_u.__u6_addr8
    
    
    #if defined __USE_MISC || defined __USE_GNU
    
    
    # define s6_addr16      __in6_u.__u6_addr16
    
    
    # define s6_addr32      __in6_u.__u6_addr32
    
    
    #endif
    
    };
    
    #endif /* !__USE_KERNEL_IPV6_DEFS */



    这个结构看起来有点乱,但是如果抛开其中的预编译选项,其实就是8个字节,用来表示IPV6版本的IP地址,一共128位,只不过划分字节的段数有些不同,每段字节多一点那么段数就少一点,反义亦然。

    那接下来我们整理一下,为了看的清楚,部分结构使用伪代码,不能通过编译,主要是方便对比,整理如下

    /* Structure describing a generic socket address.  */
    struct sockaddr
    {
     uint16 sa_family;           /* Common data: address family and length.  */
     char sa_data[14];           /* Address data.  */
    };
    
    /* Structure describing an Internet socket address.  */
    struct sockaddr_in
    {
     uint16 sin_family;          /* Address family AF_INET */ 
     uint16 sin_port;            /* Port number.  */
     uint32 sin_addr.s_addr;     /* Internet address.  */
     unsigned char sin_zero[8];  /* Pad to size of `struct sockaddr'.  */
    };
    
    /* Ditto, for IPv6.  */
    struct sockaddr_in6
    {
     uint16 sin6_family;         /* Address family AF_INET6 */
     uint16 sin6_port;           /* Transport layer port # */
     uint32 sin6_flowinfo;       /* IPv6 flow information */
     uint8  sin6_addr[16];       /* IPv6 address */
     uint32 sin6_scope_id;       /* IPv6 scope-id */
    };
    


    这么来看是不是就清晰多了,由此我们发现结构 sockaddr 和 sockaddr_in 字节数完全相同,都是16个字节,所以可以直接强转,但是结构 sockaddr_in6 有28个字节,为什么在使用的时候也是直接将地址强制转化成(sockaddr*)类型呢?

    强转的可能性
    其实sockaddr 和 sockaddr_in 之间的转化很容易理解,因为他们开头一样,内存大小也一样,但是sockaddr和sockaddr_in6之间的转换就有点让人搞不懂了,其实你有可能被结构所占的内存迷惑了,这几个结构在作为参数时基本上都是以指针的形式传入的,我们拿函数bind()为例,这个函数一共接收三个参数,第一个为监听的文件描述符,第二个参数是sockaddr*类型,第三个参数是传入指针原结构的内存大小,所以有了后两个信息,无所谓原结构怎么变化,因为他们的头都是一样的,也就是uint16 sa_family,那么我们也能根据这个头做处理,原本我没有看过bind()函数的源代码,但是可以猜一下:

    int bind(int socket_fd, sockaddr* p_addr, int add_size)
    {
        if (p_addr->sa_family == AF_INET)
        {
            sockaddr_in* p_addr_in = (sockaddr_in*)p_addr;
            //...
        }
        else if (p_addr->sa_family == AF_INET6)
        {
            sockaddr_in6* p_addr_in = (sockaddr_in6*)p_addr;
            //...
        }
        else
        {
            //...
        }
    }


    由以上代码完全可以实现IPv4和IPv6的版本区分,所以不需要纠结内存大小的不同

    总结
    通过等价替换的方式我们可以更好的了解sockaddr、sockaddr_in、sockaddr_in6之间的异同。
    网路接口函数针对于IPv4和IPv6虽然有不同的结构,但是接口基本相同,主要是为了用户(开发者)使用方便吧。
    有时间可以看一下bind()、accept()等函数,看看其中对于结构的使用到底是怎样的。
     

    展开全文
  • sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ }; sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是...

    sockaddr

    struct sockaddr {
    unsigned  short  sa_family;     /* address family, AF_xxx */
    char  sa_data[14];                 /* 14 bytes of protocol address */
    };
    

    sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET。
    sa_data是14字节协议地址。
    此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

    但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
    在网络编程经常可以看到如此示例:

    struct sockaddr_in server_sockaddr;
    bind (server_sockfd, (struct sockaddr *)&server_sockaddr, server_len);
    
    struct sockaddr_un server_sockaddr;
    bind (server_sockfd, (struct sockaddr *)&server_sockaddr, server_len);
    

    在第二个参数我们通常会将其强制转化为通用的sockaddr。以下说明

    sockaddr_in

    sockaddr_in(在netinet/in.h中定义):
    struct  sockaddr_in {
    short  int  sin_family;                      /* Address family */
    unsigned  short  int  sin_port;       /* Port number */
    struct  in_addr  sin_addr;              /* Internet address */
    unsigned  char  sin_zero[8];         /* Same size as struct sockaddr */
    };
    struct  in_addr {
    unsigned  long  s_addr;
    };
    
    typedef struct in_addr {
    union {
                struct{
                            unsigned char s_b1,
                            s_b2,
                            s_b3,
                            s_b4;
                            } S_un_b;
               struct {
                            unsigned short s_w1,
                            s_w2;
                            } S_un_w;
                unsigned long S_addr;
              } S_un;
    } IN_ADDR;
    

    sin_family指代协议族,在socket编程中只能是AF_INET
    sin_port存储端口号(使用网络字节顺序)
    sin_addr存储IP地址,使用in_addr这个数据结构
    sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    s_addr按照网络字节顺序存储IP地址

    sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
    sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
    在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

    mysock.sin_family=AF_INET;
    mysock.sin_port=htons(8080);
    mysock.sin_addr.s_addr=inet_addr(“192.168.0.1”);
    ……
    等到要做转换的时候用:
    (struct sockaddr*)&mysock

    sockaddr_un

    struct sockaddr_un 
    {
    
      sa_family_t sun_family; /*PF_UNIX或AF_UNIX */
    
      char sun_path[UNIX_PATH_MAX]; /* 路径名 */
    
      };
    

    进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。

    创建
    使用套接字函数socket创建,不过传递的参数与网络套接字不同。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:

    int sockfd;
     sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    

    绑定
    创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。例如:

    注意:
    通常在使用前会先调用unlink 删除掉这文件保证后面正常使用

     unlink(filepath);
    
     struct sockaddr_un sun;
     sun.sun_family = AF_UNIX;
     strcpy(sun.sun_path, filepath);
     bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));
    

    监听
    本地套接字的监听、接受连接操作与网络套接字类似。

    连接
    连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。

    连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式。

    附协议族

    Linux kernel include:
    
           Name         Purpose                                    Man page
           AF_UNIX      Local communication                        unix(7)
           AF_LOCAL     Synonym for AF_UNIX
           AF_INET      IPv4 Internet protocols                    ip(7)
           AF_AX25      Amateur radio AX.25 protocol               ax25(4)
           AF_IPX       IPX - Novell protocols
           AF_APPLETALK AppleTalk                                  ddp(7)
           AF_X25       ITU-T X.25 / ISO-8208 protocol             x25(7)
           AF_INET6     IPv6 Internet protocols                    ipv6(7)
           AF_DECnet    DECet protocol sockets
           AF_KEY       Key  management protocol, originally de‐
                        veloped for usage with IPsec
           AF_NETLINK   Kernel user interface device               netlink(7)
           AF_PACKET    Low-level packet interface                 packet(7)
           AF_RDS       Reliable Datagram Sockets (RDS) protocol   rds(7)
                                                                   rds-rdma(7)
           AF_PPPOX     Generic PPP transport layer, for setting
                        up L2 tunnels (L2TP and PPPoE)
           AF_LLC       Logical  link  control  (IEEE 802.2 LLC)
                        protocol
           AF_IB        InfiniBand native addressing
           AF_MPLS      Multiprotocol Label Switching
           AF_CAN       Controller Area Network  automotive  bus
                        protocol
           AF_TIPC      TIPC, "cluster domain sockets" protocol
           AF_BLUETOOTH Bluetooth low-level socket protocol
           AF_ALG       Interface to kernel crypto API
           AF_VSOCK     VSOCK   (originally  "VMWare  VSockets")   vsock(7)
                        protocol for hypervisor-guest communica‐
                        tion
           AF_KCM       KCM  (kernel connection multiplexor) in‐
                        terface
           AF_XDP       XDP (express data path) interface
    
    
    
    展开全文
  • sockaddrsockaddr_in的区别 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。 在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。 网络中的地址包含3个方面的属性...
  • 二、sockaddrsockaddr_in的相同点和区别 2.1 相同点 2.2 区别 三、使用方法 3.1 socket编程中sockaddrsockaddr_in的强制转换 3.2 补充部分 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络...
  • ipv4_storeddata = (const struct sockaddr_in *)&(_stData[index].clientaddr); if( (ipv6_clientdata->sin6_port == ipv4_storeddata->sin_port) && (ipv6_clientdata->sin6_addr.in6_u.u6_addr32[3] == ipv4_...
  • sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ }; sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常...
  • 一、IPv4套接字地址结构(struct sockaddr_in) #include<netinet/in.h> struct in_addr{ in_addr_t s_addr; /*32-bit IPv4 address*/ /*network byte ordered*/ }; s...
  • struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。 一、sockaddr sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下...
  • sockaddrsockaddr_in结构体详细讲解 二者区别struct sockaddr {unsigned short sa_family; /* address family, AF_xxx */char sa_data[14]; /* 14 bytes of protocol address */};sa_family是地址家族,一般都是...
  • struct sockaddr { unsigned short sa_family; // 2 bytes address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address }; // IPv4 AF_INET sockets: struct s...
  • SockaddrSockaddr_in 结构体说明与比较
  • socket和sockaddr以及sockaddr_in

    千次阅读 2021-11-21 15:43:07
    (bind函数是使用sockaddr类型来作为形参的,所以后面要将sockAddr_in创建的对象用强转变为sockaddr类型) sockaddr_in可以输入具体的端口和ip,如上图, 调用bind函数时,为什么要转化sockaddr_insockaddr...
  • 网络编程 - sockaddr_in , sockaddr , in_addr区别 三者都是表示网络地址的结构体 sockaddr sockaddr_in in_addr 区别 sockaddr是通用的socket地址结构体 sockaddr_in是Internet 和socket通用的地址结构体 in_...
  • sockaddr结构体struct sockaddr{sa_family_t sa_family; //地址族,最常用的是"AF_INET"(IPV4)和"AF_INET6"(IPV6);...sockaddr的缺陷:sa_data把目标地址和端口信息混在一起了sockaddr_in 结构体sockaddr_i...
  • sockaddr sockaddr 是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族 sa_data是14...
  • struct in_addr 这三个结构体在网络编程中经常忘记各自的成员,需要临时查阅。 struct sockaddr { /***** 地址族 AF_xxx *****/ unsigned short sa_family; /***** 14字节的协议地址 *****/ char sa_data[14]; ...
  • sockaddrsockaddr_in详解

    2021-06-12 14:23:43
    struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。 网络中的地址包含3个方面的属性: 1 地址类型: ipv4还是ipv6 2 ip地址 3 端口 一、sockaddr sockaddr在头文件#include <sys/socket.h&...
  • 第一,先说说两个结构体分别所在头文件的位置: sockaddr_in 在头文件 #include <netinet/in.h>... typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; /* Structur...
  • 一,sockaddr 1,头文件: #include <sys/socket.h> sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下: 2,结构体: ...二:sockaddr_in 1,头文件: #include<netinet/in.h>
  • sockaddr_in , sockaddr , in_addr区别 struct sockaddr { unsigned short sa_family; char sa_data[14]; }; 上面是通用的socket地址,具体到Internet socke...
  • 写在最前:这两个结构体主要的区别就是我们(指操作者)使用sockaddr_in设置端口、IP地址以及地址属性等参数,而不是直接使用sockaddr结构体,因为这个结构体是操作系统内核调用的,对于程序员来说不应该是透明的。...
  • 这是可能的,因为你通常会投掷指针,而不是结构本身.你做自然语言的意思是“请把这个指针指向一个socket结构作为一个指向互联网套接字结构的指针”....一个sockaddr_in也是16字节的大小 – 前2个字节是sin_fa...
  • Linux网络编程之sockaddrsockaddr_in,sockaddr_un结构体详细讲解 (1)sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,375
精华内容 40,150
关键字:

sockaddr_in