一,ipv4地址结构:
struct in_addr{ in_addr_t s_addr; }; struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; };
其中sin_zero没有用到,不过通常将整个struct 用memset置0
sin_family = AF_INET (IPv4)
sin_port 为网络字节,需要用htons转一下
sin_addr.s_addr需要用地址转换函数inet_addr转换
一般来说,各socket函数里的地址参数类型都是sockaddr*,需要进行强制类型转换, 其原因是这些函数必须处理不同协议的地址
二,字节转换函数
htons, htonl, ntohs,ntohl ; n=net h=host s=short l=long
三,地址转换函数
用于从点分十进制形式的字符串转成in_addr_t (uint32_t)
#include <arpa/inet.h>
int inet_aton(const char* strptr,in_addr* addr);
in_addr_t inet_addr(const char* strptr);
char* inet_ntoa(struct in_addr inaddr);
个人理解 a=ANSI C str, n=net
其中1和2等效,将字符串转成in_addr 或in_addr_t 好像2更常用, 3相反
函数1很蛋疼: 运行成功return 1, 失败return 0. 可能这是它用的少的原因吧
4