IPv4套接字地址结构:sockaddr_in
#include <netinet/in.h> struct in_addr { in_addr_t s_addr; // 32-bit IPv4地址,网络字节序 }; struct sockaddr_in { uint8_t sin_len; // 结构长度 sa_family_t sin_family; // AF_INET in_port_t sin_port; // 16-bit TCP/UDP 端口号,网络字节序 struct in_addr sin_addr; char sin_zero[8]; // unused };
通用套接字地址结构:sockaddr
用于声明将套接字地址结构作为一个参数传递进任何套接字函数时所传递的指针的数据类型
对于开发者而言,这些通用套接字地址结构的唯一用途是:对指向特定于协议的套接字地址
结构的指针执行类型强制转换
#include <sys/socket.h> struct sockaddr { uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; };
IPv6套接字地址结构:sockaddr_in6
#include <netinet/in.h> struct in6_addr { uint8_t s6_addr[16]; // 128-bit IPv6地址,网络字节序 }; #define SIN6_LEN struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; // AF_INET6 in_port_t sin6_port; uint32_t sin6_flowinfo; // 流信息 struct in6_addr sin6_addr; uint32_t sin6_scope_id; // 为scope设置接口 };
新的通用套接字地址结构:sockaddr_storage
#include <netinet/in.h> struct sockaddr_storage { uint8_t ss_len; sa_family_t ss_family; };
主机(h)字节序和网络(n)字节序之间相互转换的函数:
#include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); // 返回网络字节序值 uint32_t htons(uint16_t host32bitvalue); // 返回网络字节序值 uint16_t ntohs(uint16_t net16bitvalue); // 返回网络字节序值 uint32_t ntohs(uint32_t net16bitvalue); // 返回主机字节序值
字节操纵函数:
//源自Berkeley #include <strings.h> // 将自dest所指位置开始的nbytes个字节置0 void bzero(void *dest, size_t nbytes); // 将自src所指位置开始的nbytes个字节复制到的dest所指的位置 void bcopy(const void *src, void *dest, size_t nbytes); // 比较ptr1与ptr2所指位置开始的nbytes字节是否相等,若相等则返回0,否则返回非0 int bcmp(const void *ptr1, const * ptr2, size_t nbytes);
//ANSI C函数 #include <string.h> // 将目标字符串dest指定数目len的字节置为值c void *memset(void *dest, int c, size_t len); // 将自src所指位置开始的nbytes个字节复制到的dest所指的位置 void *memcpy(void *dest, const void *src, size_t nbytes); // 比较ptr1与ptr2所指位置开始的nbytes字节是否相等,若相等则返回0,否则返回非0 int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
适用于IPv4的地址转换函数
#include <arpa/inet.h> // 将strptr所指的C字符串转换成一个32位的网络字节序二进制值,并存储在addrptr中 //若字符有效则返回1,否则为0 int inet_aton(const char *strptr, struct in_addr *addrptr); // 将strptr所指的C字符串转换成一个32位的网络字节序二进制值,并作为返回值返回 // 此函数目前已被废弃 in_addr_t inet_addr(const char *strptr); // 将一个32位的网络字节序二进制IPV4地址转换成相应的点分十进制数串,并返回它的指针 char *inet_ntoa(struct in_addr inaddr);
对于IPv4和IPv6都适用
#include <arpa/inet.h> // 尝试转换有strptr指针所指的字符串,并通过addrptr存放二进制结果 // 若成功则返回1,若strptr所指字符串不是有效的表达式格式,返回0,出错返回-1 int inet_pton(int family, const char *strptr, void *addrptr); // 将一个网络字节序二进制地址转换成相应的点分十进制数串,并返回它的指针,出错返回NULL // 调用者必须为strptr分配内存,strptr不能是一个空指针,当调用成功时,这个指针就是该函数的返回值 const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);