C语言HTTP请求GET

因对《所谓黑客揭秘》,大家都攻击代码的要求。所以我开始了为期两周的C/C++学习。由于没有任何C/C++基础,而是临时突击,所以代码肯定漏洞甚多,请观者见谅。同时欢迎拍砖或者支出代码错误,以求大家共同进步。

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <winsock.h>  
  4. #include <stdlib.h>  
  5.   
  6. void DownLoad(char *url){  
  7.     WSADATA WsaData;  
  8.     SOCKET socketfd;  
  9.     SOCKADDR_IN addr;  
  10.     HOSTENT *pURL;  
  11.     int i=0;  
  12.     char myurl[BUFSIZ];  
  13.     char *pHost =0,* pGet =0;  
  14.     char host[BUFSIZ],GET[BUFSIZ];  
  15.     char Header[BUFSIZ];  
  16.     FILE * pf;  
  17.   
  18.     static char text[BUFSIZ];  
  19.   
  20.     if (WSAStartup(MAKEWORD(2,2),&WsaData))  
  21.     {  
  22.         printf("The socket failed");  
  23.         return;  
  24.     }  
  25.     strcpy(myurl,url);  
  26.   
  27.     for (i=0,pHost= myurl;*pHost!='/'&&*pHost!='/0';pHost++,i++){  
  28.         host[i] = *pHost;  
  29.     }  
  30.     host[i]='/0';  
  31.     strcpy(GET,pHost);  
  32.     strnset(Header,'/0',BUFSIZ);  
  33.   
  34.   
  35.     socketfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);  
  36.     pURL = gethostbyname(host);  
  37.   
  38.     addr.sin_addr.s_addr = *((unsigned long *)pURL->h_addr);  
  39.     addr.sin_family = AF_INET;  
  40.     addr.sin_port = htons(80);  
  41.   
  42.       
  43.   
  44.     strcat(Header,"GET / ");  
  45.     strcat(Header,GET);  
  46.     strcat(Header,"HTTP/1.1/r/n");  
  47.     strcat(Header,"Accept: */*/r/n");  
  48.     strcat(Header,"Accept-Language: zh-cn/r/n");  
  49.     strcat(Header,"User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2)/r/n");  
  50.     //strcat(Header,"Accept-Encoding: gzip, deflate/r/n");  
  51.     strcat(Header,"Host: ");  
  52.     strcat(Header,host);  
  53.     strcat(Header,"/r/nConnection: Keep-Alive/r/n");  
  54.       
  55.     strcat(Header,"/r/n/r/n");  
  56.       
  57.     connect(socketfd,(SOCKADDR *)&addr,sizeof(addr));  
  58.     send(socketfd,Header,strlen(Header),0);  
  59.     printf("%s",Header);  
  60.     pf = fopen("1.txt","w");  
  61.     while(recv(socketfd,text,BUFSIZ,0)>0){  
  62.         printf("%s",text);  
  63.         fputs(text,pf);  
  64.         strnset(text,'/0',BUFSIZ);  
  65.     }  
  66.     fclose(pf);  
  67.     closesocket(socketfd);  
  68.     WSACleanup();  
  69.   
  70.       
  71. }  
  72. int main(){  
  73.     char a[256];  
  74.     printf("http://");  
  75.     scanf("%s",a);  
  76.     DownLoad(a);  
  77. }  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用Socket API来构造HTTP请求。以下是一个基本的HTTP请求构造方式: 1. 创建Socket连接:使用Socket API创建一个TCP连接。 2. 构造HTTP请求:使用C语言代码构造HTTP请求,包括请求方法、请求头、请求体等。 3. 发送HTTP请求:使用Socket API发送HTTP请求。 4. 接收HTTP响应:使用Socket API接收HTTP响应。 5. 处理HTTP响应:解析HTTP响应,从中提取所需信息,如响应头、响应体等。 6. 关闭Socket连接:使用Socket API关闭TCP连接。 下面是一个简单的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define MAXLINE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servaddr; char sendline[MAXLINE], recvline[MAXLINE]; if (argc != 2) { fprintf(stderr, "usage: %s <URL>\n", argv[0]); exit(1); } // 创建Socket连接 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket error"); exit(1); } // 设置服务器地址和端口号 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); // HTTP默认端口号为80 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { fprintf(stderr, "inet_pton error for %s\n", argv[1]); exit(1); } // 建立连接 if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("connect error"); exit(1); } // 构造HTTP请求 sprintf(sendline, "GET / HTTP/1.1\r\n"); sprintf(sendline, "%sHost: %s\r\n", sendline, argv[1]); sprintf(sendline, "%sConnection: close\r\n", sendline); sprintf(sendline, "%s\r\n", sendline); // 发送HTTP请求 if (send(sockfd, sendline, strlen(sendline), 0) < 0) { perror("send error"); exit(1); } // 接收HTTP响应 while (recv(sockfd, recvline, MAXLINE, 0) > 0) { printf("%s", recvline); } // 关闭连接 close(sockfd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值