Linux下C语言url请求

2020年2月22日05:41:37
评论

任何代码只有你写过,才能深刻理解,有的时候看文档看的很茫然的时候,尽量找点别人的源码,在别人源码上更改,在调试,可能会达到事半功倍的效果。
 
近来项目需要Linux中访问一个url接口传参数及获取返回值,看了很多方法,知道用socket,但是没接触过,感觉很茫然,就在网上找实例,看看了,有了一点感觉,又在别人的实例上改动之后竟然可以用了,当时就卡在了http的格式上,下面写个demo,只要在我的代码上吧url换了,肯定可以成功。注意url不要http://

Linux下关于时间概念的C语言编程 http://www.linuxidc.com/Linux/2014-04/99747.htm

C++ 隐式类类型转化 Implicit Class-Type Conversions http://www.linuxidc.com/Linux/2013-01/78071.htm

C语言变长数组之剖析 http://www.linuxidc.com/Linux/2013-07/86997.htm

C语言需要注意的问题 http://www.linuxidc.com/Linux/2013-05/84301.htm

C语言位域的使用及其注意点 http://www.linuxidc.com/Linux/2013-07/87027.htm

C语言中简单的for循环和浮点型变量 http://www.linuxidc.com/Linux/2013-08/88514.htm

《C语言从入门到精通》.(王娣,韩旭 ).[PDF] + DVD视频光盘文件 http://www.linuxidc.com/Linux/2013-10/91775.htm
 
#include <stdio.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <string.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <stdlib.h>
 

#define BUFSIZE 0xF000
 void geturl(char* url)
 {
        int cfd;
        struct sockaddr_in cadd;
        struct hostent *pURL = NULL;
        char myurl[BUFSIZE];
        char *pHost = 0;
        char host[BUFSIZE],GET[BUFSIZE];
        char request[BUFSIZE];
        static char text[BUFSIZE];
        int i,j;
 

        //分离主机中的主机地址和相对路径
        memset(myurl,0,BUFSIZE);
        memset(host,0,BUFSIZE);
        memset(GET,0,BUFSIZE);
        strcpy(myurl,url);
        for(pHost = myurl;*pHost != '/' && *pHost != '\0';++pHost);
 

        //获取相对路径保存到GET中
        if((int)(pHost-myurl) == strlen(myurl))
        {
                strcpy(GET,"/");//即url中没有给出相对路径,需要自己手动的在url尾
 //部加上/
        }
        else
        {
                strcpy(GET,pHost);//地址段pHost到strlen(myurl)保存的是相对路径
        }
 
        //将主机信息保存到host中
        //此处将它置零,即它所指向的内容里面已经分离出了相对路径,剩下的为host信
 //息(从myurl到pHost地址段存放的是HOST)
        *pHost = '\0';
        strcpy(host,myurl);
        //设置socket参数
        if(-1 == (cfd = socket(AF_INET,SOCK_STREAM,0)))
        {
                printf("create socket failed of client!\n");
                exit(-1);
        }
 
        pURL = gethostbyname(host);//将上面获得的主机信息通过域名解析函数获得域>名信息
 
        //设置IP地址结构
        bzero(&cadd,sizeof(struct sockaddr_in));
        cadd.sin_family = AF_INET;
        cadd.sin_addr.s_addr = *((unsigned long*)pURL->h_addr_list[0]);
        cadd.sin_port = htons(80);
        //向WEB服务器发送URL信息
        memset(request,0,BUFSIZE);
        strcat(request,"GET ");
        strcat(request,GET);
        strcat(request," HTTP/1.1\r\n");//至此为http请求行的信息
        strcat(request,"HOST: ");
        strcat(request,host);
        strcat(request,"\r\n");
        strcat(request,"Cache-Control: no-cache\r\n\r\n");
        //连接服务器
 

企鹅博客
  • 本文由 发表于 2020年2月22日05:41:37
  • 转载请务必保留本文链接:https://www.qieseo.com/179710.html

发表评论