linux c网络学习总结2(IP地址相关的操作)
AF_INET Stream Data Structures
struct sockaddr_in {
short int sin_family; //使用的协议簇; 值为AF_INET
unsigned short int sin_port; //要使用的端口号,范围是从0 到65535,普通程序使用从1024到65535
struct in_addr sin_addr; //要使用的IP地址结构体,不是点分十进制,是一个数值型
}
struct in_addr在不同的书中可以看到两种格式
格式一
struct in_addr {
unsigned long int s_addr; //32位。使用大端格式存储数据
}
格式二
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr; //32位。使用大端格式存储数据,
};
大多数书在讲解的时候才用的是格式一,简单容易记忆,并且是真实的格式(最原始的数据类型)。少数使用格式二,符合POSIX的命名格式,考虑安全和可移植性。(个人观点)
FUNCTIONS
in_addr_t inet_addr(const char* cp)
include: netinet/in.h
return: 成功返回点分十进制ip对应的in_addr_t类型的值,失败返回-1,
description: 将将点分十进制IPv4地址转化为程序可用的IP地址(in_addr_t 数据,转换为网络上可以传输的数据存储格式)
parameter:
cp:点分十进制ip格式字符串的首地址。eg:210.43.32.51
eg:
struct sockaddr_in s_addr;
s_addr.sin_addr.s_addr = inet_addr ("210.43.32.51");
int inet_aton (char *cp, struct in_addr * addr)
include: arpa/inet.h
return: 成功返回1,cp是有效的IP地址,出错返回0,
description:将点分十进制的IPv4地址转换成32位网络字节序二进制IP地址格式。
parameter:
cp:点分十进制ip格式字符串的首地址。eg:210.43.32.51
struct in_addr: 存放转换的结果,32位网络字节序二进制
eg:
in_addr addr;
inet_aton ("210.43.32.51", &addr);
char inet_ntoa (struct in_addr addr)
include: arpa/inet.h
return: 返回指向存放点分十进制IP地址字符串得而首地址
description: 将32位网络字节序二进制IP地址格式转换成点分十进制的IPv4地址。
parameter:
cp:点分十进制ip格式字符串的首地址。eg:210.43.32.51
struct in_addr: 存放转换的结果,32位网络字节序二进制
eg:
in_addr addr;
inet_aton ("210.43.32.51", &addr);
printf ("%s", inet_ntoa (addr));
int inet_pton (int family, const char *cp, void *addr)
include: arpa/inet.h
return: 1:成功,0: family指定的地址族和cp格式不对, -1:出错,查看errno
description: 将字符串格式的IP地址(IPv4点分十进制和IPv6冒分16进制)转换为网络字节序二进制IP地址格式
paramater:
family:使用的协议簇,值是AF_INET 或 AFINET6
cp: 字符串格式的IP地址.IPv4点分十进制(210.43.32.51),IPv6冒分16进制(2001:DB8:2de:0:0:0:0:e13)
addr: 转换成功网络字节序二进制IP地址格式的存放位置
char * inet_ntop (int family, void *addr, char *cp, siz