域名解析
主机信息通过结构体传输
char *h_name 字符串地址
char **h_aliases 指针数组
char **h_addr_list 指针数组,指针的值为结构体形式的IP地址,需要强转成struct **
printf("主机别名:\n");
for(char ** pp = host->h_aliases;*pp;pp++){//pp指向NULL时为假,循环结束
printf("%s\n",*pp);//*pp为字符串地址
}
printf("IP地址表:\n");
for(struct in_addr** pp = (struct in_addr**)host->h_addr_list;*pp;pp++){
printf("%s\n",inet_ntoa(**pp));//IP为值,结构体形式IP地址转化成点分十进制字符串
}
pp记录指针数组每一个元素的地址
*pp=指针数组每一个元素的值=结构体类型IP地址的地址
**pp=IP地址的值
HTTP协议
1 //http协议
2 #include<stdio.h>
3 #include<string.h>
4 #include<stdlib.h>
5 #include<unistd.h>
6 #include<sys/socket.h>
7 #include<sys/types.h>
8 #include<arpa/inet.h>
9
10 int main(int argc,char* argv[]){
11 //./a.out <IP地址> <域名> [<路径>]
12 if(argc < 3){
13 fprintf(stderr,"用法:./a.out <IP地址> <域名> [<资源路径>]\n");
14 return -1;
15 }
16 char* ip = argv[1];
17 char* name = argv[2];
18 char* path = argc < 4 ? "" : argv[3];
19 //创建套接字
20 int sockfd = socket(AF_INET,SOCK_STREAM,0);
21 if(sockfd == -1){
22 perror("socket");
23 return -1;
24 }
25 //组织服务器的地址结构
26 struct sockaddr_in ser;
27 ser.sin_family = AF_INET;
28 ser.sin_port = htons(80);
29 ser.sin_addr.s_addr = inet_addr(ip);
30 //向服务器发起连接
31 if(connect(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){
32 perror("connect");
33 return -1;
34 }
35 char request[1024];
36 sprintf(request,
37 "GET /%s HTTP/1.1\r\n"//方法,URL,协议版本
38 "Host: %s\r\n"//访问域名
39 "Accept: */*\r\n"//接收任何类型介质
40 "Connection: Close\r\n"//不需要持久连接
41 "User-Agent: Mozilla/5.0\r\n"//浏览器表明自己身份
42 "Referer: %s\r\n\r\n",path,name,name);
43 //发送组织好的http请求
44 if(send(sockfd,request,strlen(request),0) == -1){
45 perror("send");
46 return -1;
47 }
48 //接收服务器的http响应
49 for(;;){
50 char respond[1024] = {};
51 ssize_t size = recv(sockfd,respond,sizeof(respond) - 1,0);
52 if(size == -1){
53 perror("recv");
54 return -1;
55 }
56 if(size == 0){
57 break;
58 }
59 printf("%s",respond);
60 }
61 printf("\n");
62 //关闭套接字
63 close(sockfd);
64 return 0;
65 }
输出重定向到.html动态页面文件