日期:2014-05-16  浏览次数:20754 次

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