一、Linux下IP地址的表示方式
1.1、通用套接字的地址类型定义如下:
struct sockaddr
{
sa_family_t sa_family; /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
上述结构中,定义在头文件<ifaddrs.h>中,sa_family_t实际上是 unsigned short int类型,故该结构的共占用16个字节。
1.2、以太网中的地址类型表示
struct sockaddr_in
{
sa_family_t sin_family;
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)];
};
/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
1.3、结构sockaddr和结构sockaddr_in的关系
在sockaddr_in中,只使用了前面的8个字节,为了和sockaddr中保持结构大小一直,其后面的8个字节填充保留。
1.4、本地socket中使用的地址类型
typedef unsigned short __kernel_sa_family_t;
#define UNIX_PATH_MAX 108
struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */
};
其中,sun_family的取值一般使用AF_UNIX或者AF_LOCAL,sun_path是一个路径名。
二、IP地址的转换
2.1 字符串IP与二进制IP地址的转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp,struct in_addr *inp);
in_addr_t inet_addr(const char * cp);
char * inet_ntoa(struct in_addr in);
inet_aton()函数
inet_addr()函数
inet_ntoa()函数
2.2 IP转换函数之通用的版本
int inet_pton (int af, const char *src,void *dst);
const char *inet_ntop (int af, const void *src,char *dst, socklen_t size);
inet_pton()函数
inet_ntop()函数