抓取网页
hostent:
hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
struct hostent {
char *h_name; 地址的正式名称。
char **h_aliases; 空字节-地址的预备名称的指针
int h_addrtype; 地址类型; 通常是AF_INET。
int h_length; 地址的比特长度
char **h_addr_list; 零字节-主机网络地址指针。网络字节顺序。
#define h_addr h_addr_list[0]
};
gethostbyname()成功时返回一个指向结构体 hostent 的指针,或者是个空(NULL)指针。
inet_ntoa:
char *inet_ntoa(struct in_addr in);
struct in_addr {
unsigned long int s_addr;
}
inet_ntoa把类型为struct in_addr的数据转化为"数字+句点"的形式的字符串.
inet_ntoa(*((struct in_addr *)host->h_addr_list[0]))
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET, 代表TCP/IP协议族。
sa_data是14字节协议地址。
此数据结构用做bind、connect、 recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
然后用进行类型转换就可以了 bzero((char*)&mysock,sizeof(mysock));//初始化
sockaddr_in mysock;
bzero((char*)&mysock,sizeof(mysock));
mysock.sa_family=AF_INET;
mysock.sin_port=htons(1234);//1234是端口号
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
浙公网安备 33010602011771号