1.早期通用地址结构sockaddr:
typedef unsigned short sa_family;
#include <sys/socket.h>
struct sockaddr{
sa_family_t sa_family; //地址族
char sa_data[14]; //地址值,实际可能更长
};
2.IPv4 “国际套接口地址结构”sockaddr_in
#include <netinet/in.h>
struct in_addr{
in_addr_t s_addr; //32-bit 网络序
};
struct sockaddr_in{
sa_family_t sin_family; //AF_INET
in_port_t sin_port; //16-bit 网络序
struct in_addr sin_addr;
char sin_zreo[8]; //unused
};
3.字节排序函数——端口转换
#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
返回值:网络字节序值
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
返回值:主机字节序
4. IP地址 ——ASCII字符串与网络序二进制值转换
#include <arpa/inet.h>
int inet_aton(const char *strptr,struct in_addr *addrptr);
参数1:strptr是指向 ASCII字符串的指针 *指针如果为NULL仍然检查有效性,但不存储结果
参数2:addrpt是r指向 存储32位网络序二进制的指针
返回值:1——字符串有效,0——无效
in_addr_t inet_addr(const char *strptr);
参数:strptr是指向 ASCII字符串的指针
返回值:成功返回 32位二进制网络序地址,失败返回INADDR_NONE
char *inet_ntoa(struct in_addr inaddr);
返回:指向点分十进制数串的指针
int inet_pton(int family,const char *strptr,void *addrptr);
参数1:AF_INET AF_INET6
参数2:strptr是指向 ASCII字符串的指针
参数3:addrpt是r指向 存储32位网络序二进制的指针
返回值:1——成功,0——输入不是有效的表达格式,-1——出错
const cahr *inet_ntop(int family,const void *addrptr,char *strptr,size_t len);
参数1:AF_INET AF_INET6
参数2:addrpt是r指向 存储32位网络序二进制的指针
参数3:strptr是指向 ASCII字符串的指针
参数4:#define INET_ADDRSTRLEN 16 IPv4
#defien INET6_ADDRSTRLEN 46 IPv6
返回值:成功——指针,出错——NULL