socket addr 结构体

在 sys/socket.h 中定义sockaddr 结构体

struct sockaddr {
    sa_family_t     sa_family;      // 地址簇
    char            sa_data[14];      // 14字节,包含套接字中的目标地址和目标端口信息
};

在 netinet/in.h 中定义了sockaddr_in结构体

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */

    /* 对struct sockaddr的补充字节 */
    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
};

/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr {
    in_addr_t      s_addr;     /* address in network byte order */
};

/*ipv6对应的是: */
struct sockaddr_in6 {
    sa_family_t     sin6_family;   /* AF_INET6 */
    in_port_t       sin6_port;     /* port number */
    uint32_t        sin6_flowinfo; /* IPv6 flow information */
    struct in6_addr sin6_addr;     /* IPv6 address */
    uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */
};

struct in6_addr {
    unsigned char   s6_addr[16];   /* IPv6 address */
};

/*Unix域对应的是: */
#define UNIX_PATH_MAX    108

struct sockaddr_un {
    sa_family_t sun_family;               /* AF_UNIX */
    char        sun_path[UNIX_PATH_MAX];  /* pathname */
};

注意:

  • sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息,是一种通用的套接字地址。
  • sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数;sockaddr_in用于socket定义和赋值;sockaddr用于函数参数。
文档更新时间: 2021-03-07 21:30   作者:周国强