Unix C学习笔记20 域名解析,HTTP协议

域名解析

主机信息通过结构体传输

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动态页面文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值