学习或者读一本书重在积累,看后的想法,书中的一些以前自己不知道的地方。每天坚持都写点东西,激励自己。
bzero不是ANSI C函数。它起源于早期的berkeley网络编程代码,这本书多是使用它而不是ANSI C的memset函数,因为bzero(带2个参数)比memset(带3个参数)更好记忆。几乎所有支持套接字API的厂商都提供bzero,如果没有,可以使用unp.h头文件中提供的该函数的宏定义。
inet_pton函数,是一个支持IPv6的新函数,以前的代码使用inet_addr函数来把ASCII点分十进制数串变换成正确的格式,不过它有不少局限,而这些局限在inet_pton中都得以纠正。
inet_pton:Linux下IP地址转换函数,可以将IP地址在点分十进制和整数之间转换。
int inet_pton(int af, const char *src, void *dst);
inet_pton是inet_addr的扩展,支持多地址族 af = AF_INET,src指向字符型的地址(ipv6的地址),即ASCII的首地址(ddd.ddd.ddd.ddd),函数将该地址转换为in_addr(in6_addr)的结构体,并复制在*dst中。如果出错返回一个负值,并将errno设置为EAFNOSUPPORT,如果af指定的地址族和src格式不对,函数将返回0。
inet_ntop:const *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
后者比前者多了socklen_t cnt,指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPC。
struct sockaddr{
unsigned short sa_family; /*address family, AF_XXX*/
char sa_data[14]; /*14bytes of protocol address*/
<netinet/in.h>
struct sockaddr_in {
short sin_family; /*address family*/
unsigned short sin_port; /*port number*/
struct in_addr sin_addr; /*internet address*/
unsigned char sin_zero[8]; /*same size as struct sockaddr*/
};
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可指向sockaddr的结构体,并代替它,即可以使用sockaddr_in建立你所需要的信息,然后用bzero函数初始化就可以了,如下:
sockaddr_in mysock;
bzero((char*)&mysock,sizeof(mysock));