1.套接字地址结构
IPv4套接字地址结构
IPv4套接字地址结购也称为“网络套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>中。
1: struct in_addr{
2: in_addr_t s_addr; //32-bit IPv4 address
3: };4:5: struct sockaddr_in{
6: unit8_t sin_len;7: sa_familt_t sin_family;8: in_port_t sin_port;9: struct in_addr sin_addr;
10: char sin_zero[8];
11: };
2.字节排序函数
内存中存储数据有两种方法:一种是将低字节存储在起始地址,这称为小端字节序;另一种方法是将高字节序存储在起始地址,这称为大端字节序。
术语“小端”和“大端”表示多个字节值的哪一端存储在该值的起始位置
网际协议使用大端字节序来传送这些多字节整数
我们用以下的函数进行主机字节序和网络字节序的转换
1: #include<netinet/in.h>2:3: uint16_t htons(uint16_t host16bitvalue);4: unit32_t htonl(unit32_t host32bitvalue);5: //返回网络字节序值
6: unit16_t ntohs(unit16_t host16bitvalue);7: unit32_t ntohl(uint32_t host32bitvalue);8: //返回主机字节序值
3.inet_aton、inet_addr和inet_ntoa函数
以下函数用来在ASCII字符串与网络字节序的二进制值之间转换网际地址。
inet_aton、inet_addr和inet_ntoa在点分十进制数串与它长度为32位的网络字节序二进制值间转换IPv4地址
1: #include<arpa/inet.h>2:3: int inet_aton(const char *strptr,struct in_addr *addrptr);4: //返回:若字符串有效则为1,否则为0
5: in_addr_t inet_addr(const char *strptr);6: //若字符串有效则为32位二进制网络字节序的IPv4地址,否则为INADDR_NONE
7: char *inet_ntoa(struct in_addr inaddr);8: //返回一个指向点分十进制数串的指针
以上的函数只能用于IPv4地址,以下的函数适合IP4和IP6
1: #inlcude<arpa/inet.h>2:3: int inet_pton(int family,const char *strptr,void *addrptr);4: //返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
5: const char *inet_ntop(int family,const void *addrptr,char *strptr,size_t len);6: //若成功则为指向结果的指针,若出错则为NULL