linux 网络编程【一】 socket地址

  • linux socket中三种地址

  • sockaddr普通的socket地址
typedef unsigned short sa_family_t;
struct sockaddr {
        sa_family_t     sa_family;    /* address family, AF_xxx       */
        char            sa_data[14];    /* 14 bytes of protocol address */
}


  • sockaddr_in Internet的socket地址
/* 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)];     
                           /* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */
};

struct in_addr {
unit32_t s_addr; /* Internet address */
};


  • sockaddr_un Unix系统的socket地址
struct sockaddr_un {

  sa_family_t sun_family; /*PF_UNIX或AF_UNIX */

  char sun_path[UNIX_PATH_MAX]; /* 路径名 */

  };


  • linux socket中的地址转换

在一般的x86架构的PC中采用的是小端模式存储数据,而对于socket中所需要的是大端模式因而需要进行相关的转换。一般的转换函数有
  • socket通用转换函数
ntohl将网络32位字节数据转换为主机数据
ntohs将网络16位字节数据转换为主机数据
htonl将主机32位字节数据转换为网络数据
htons将网络16位字节数据转换为网络数据
  • inet转换函数
inet_ntoa将网络字节的ip地址转换为十进制点分地址
inet_aton将点分十进制地址转换为网络字节的ip地址
inet_network将点分十进制转换为主机字节的32位数据

  • 总结

一般网络编程填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构,都是16个字符长。

你可能感兴趣的:(linux 网络编程【一】 socket地址)