1.套接字的地址结构
结构struct sockaddr定义了一种通用的套接字地址, 它在头文件linux/socket 中定义: struct socketsddr{ unsigned short sa_family; //地址类型,AF_xxx char sa_data[14]; // 14字节的协议地址 }; 其中sa_family表示套接字的协议族类型,对应于TCP/IP协议的AF_INET,成员sa_data存储具体的协议地址,sa_data之所以被定义成14字节的,因为有的协议族使用较长的地址格式,一般编程中并不对该结构体进行操作,而是使用另一个与它等价的数据结构:sockaddr_in. 每种协议族都有自己的协议地址格式,TCP/IP地址的格式为结构体struct sockaddr_in, 它在头文netinet/in.h中定义.格式如下: struct sockaddr_in{ unsigned short sin_family; //地址类型 unsigned short int sin_port; //端口号 struct in_addr sin_addr; //IP地址 unsigned char sin_size[8]; //填充字节一般为0 }; struct in_addr的定义如下: struct in_addr{ unsigned long s_addr; }; 结构体sockaddr的长度为16 字节,结构体sockaddr_in的长度也为16字节 ,通常使用sockaddr_in设置地址,然后强制类型转换为sockaddr; 来看例子:
struct sockaddr_in sock; sock.sin_family=AF_INET; sock.sin_port=htons(80); //设置端口 sock.sin_addr.s.addr=inet_addr("222.102.3.165"); //设置地址 memset(sock.sin_zero,0,sizeof(sock.sin_zero)); //将数组sin_zero清零
其中memet(void *s,int c,size_t n); 它将s指向的内存区域的前n个字节赋值由参数c 指定的值; 其中清零的字节处理函数还有bzero(),bcopy(),memcpy()等; void bzero(void *s,int n); 函数的具体操作是将参数s指定的前n个字节清零,