分类: C/C++
2008-04-17 09:10:07
1.数据结构
1.1 struct in_addr
struct in_addr {
in_addr_t s_addr; /* 32位IPV4地址 */
};
1.2 struct sockaddr_in
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* internet地址(32位IPV4) */
unsigned char sin_zero[8]; /* 不知道什么用,反正没用到过 */
};
1.3 struct sockaddr
struct sockaddr {
unsigned short sa_family; /* 地族,当然也是 AF_xxx */
char sa_data[14]; /* 14 bytes 协议地址 */
};
1.4 struct hostent
struct hostent {
char *h_name; /* 主机的官方域名 */
char **h_aliases; /* 一个以NULL结尾的主机别名数组 */
int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */
int h_length; /*地址的字节长度 */
char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/
};
>>>struct hostent *gethostbyname(const char *name); 产生,参数是域名
1.5 用法
struct sockaddr_in server;
1.5.1用点分IP地址赋值IP
server.sin_addr.s_addr=inet_addr("192.168.0.1");
>>>char *inet_ntoa(struct in_addr in); //in一般来源于struct sockaddr_in中的sin_addr成员,与上面函数功能基本相反
1.5.2赋值端口号
server.sin_port=hton(port);
>>> htons()
htonl()
ntohs()
ntohl()
>>>
htons把16位本地字节序转换成16位网络字节序,ntohs刚好相反
htonl把32位本地字节序转换成32位网络字节序,ntohl刚好相反
>>>取出sin_port时要ntoh(sin_port)才行
1.5.3赋值sin_family
server.sin_family = AF_INET;
bzero(server.sin_zero, 8); >>>置0
1.5.4
数据结构类型转换
(struct sockaddr *)&server >>>转换成struct sockaddr,我们一直可以用struct sockaddr_in来欺骗