前段时间,帮朋友实现linux C实现HTTP get 及POst请求,最原先打算使用libcurl库实现。但是考虑到和其他接口通信的情况,暂时使用C 来实现.代码可以自动解析URL连接,具体看下面代码:
/*File : http.h *Auth : sjin *Date : 20141206 *Mail : 413977243@qq.com */ #ifndef _MY_HTTP_H #define _MY_HTTP_H #define MY_HTTP_DEFAULT_PORT 80 char * http_get(const char *url); char * http_post(const char *url,const char * post_str); #endif /*File : http.c *Auth : sjin *Date : 20141206 *Mail : 413977243@qq.com */ #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #include "http.h" #define BUFFER_SIZE 1024 #define HTTP_POST "POST /%s HTTP/1.1rnHOST: %s:%drnAccept: */*rn" "Content-Type:application/x-www-form-urlencodedrnContent-Length: %drnrn%s" #define HTTP_GET "GET /%s HTTP/1.1rnHOST: %s:%drnAccept: */*rnrn" static int http_tcpclient_create(const char *host, int port){ struct hostent *he; struct sockaddr_in server_addr; int socket_fd; if((he = gethostbyname(host))==NULL){ return -1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)he->h_addr); if((socket_fd = socket(AF_INET,SOCK_STREAM,0))==-1){ return -1; } if(connect(socket_fd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1){ return -1; } return socket_fd; } static void http_tcpclient_close(int socket){ close(socket); } static int http_parse_url(const char *url,char *host,char *file,int *port) { char *ptr1,*ptr2; int len = 0; if(!url || !host || !file || !port){ return -1; } ptr1 = (char *)url; if(!strncmp(ptr1,"http://",strlen("http://"))){ ptr1 += strlen("http://"); }else{ return -1; } ptr2 = strchr(ptr1,'/'); if(ptr2){ len = strlen(ptr1) - strlen(ptr2); memcpy(host,ptr1,len); host[len] = ' '; if(*(ptr2 + 1)){ memcpy(file,ptr2 + 1,strlen(ptr2) - 1 ); file[strlen(ptr2) - 1] = ' '; } }else{ memcpy(host,ptr1,strlen(ptr1)); host[strlen(ptr1)] = ' '; } //get host and ip ptr1 = strchr(host,':'); if(ptr1){ *ptr1++ = ' '; *port = atoi(ptr1); }else{ *port = MY_HTTP_DEFAULT_PORT; } return 0; } static int http_tcpclient_recv(int socket,char *lpbuff){ int recvnum = 0; recvnum = recv(socket, lpbuff,BUFFER_SIZE*4,0); return recvnum; } static int http_tcpclient_send(int socket,char *buff,int size){ int sent=0,tmpres=0; while(sent < size){ tmpres = send(socket,buff+sent,size-sent,0); if(tmpres == -1){ return -1; } sent += tmpres; } return sent; } static char *http_parse_result(const char*lpbuf) { char *ptmp = NULL; char *response = NULL; ptmp = (char*)strstr(lpbuf,"HTTP/1.1"); if(!ptmp){ printf("http/1.1 not faindn"); return NULL; } if(atoi(ptmp + 9)!=200){ printf("result:n%sn",lpbuf); return NULL; } ptmp = (char*)strstr(lpbuf,"rnrn"); if(!ptmp){ printf("ptmp is NULLn"); return NULL; } response = (char *)malloc(strlen(ptmp)+1); if(!response){ printf("malloc failed n"); return NULL; } strcpy(response,ptmp+4); return response; } char * http_post(const char *url,const char *post_str){ char post[BUFFER_SIZE] = {' '}; int socket_fd = -1; char lpbuf[BUFFER_SIZE*4] = {' '}; char *ptmp; char host_addr[BUFFER_SIZE] = {' '}; char file[BUFFER_SIZE] = {' '}; int port = 0; int len=0; char *response = NULL; if(!url || !post_str){ printf(" failed!n"); return NULL; } if(http_parse_url(url,host_addr,file,&port)){ printf("http_parse_url failed!n"); return NULL; } //printf("host_addr : %stfile:%st,%dn",host_addr,file,port); socket_fd = http_tcpclient_create(host_addr,port); if(socket_fd < 0){ printf("http_tcpclient_create failedn"); return NULL; } sprintf(lpbuf,HTTP_POST,file,host_addr,port,strlen(post_str),post_str); if(http_tcpclient_send(socket_fd,lpbuf,strlen(lpbuf)) < 0){ printf("http_tcpclient_send failed..n"); return NULL; } //printf("发送请求:n%sn",lpbuf); /*it's time to recv from server*/ if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){ printf("http_tcpclient_recv failedn"); return NULL; } http_tcpclient_close(socket_fd); return http_parse_result(lpbuf); } char * http_get(const char *url) { char post[BUFFER_SIZE] = {' '}; int socket_fd = -1; char lpbuf[BUFFER_SIZE*4] = {' '}; char *ptmp; char host_addr[BUFFER_SIZE] = {' '}; char file[BUFFER_SIZE] = {' '}; int port = 0; int len=0; if(!url){ printf(" failed!n"); return NULL; } if(http_parse_url(url,host_addr,file,&port)){ printf("http_parse_url failed!n"); return NULL; } //printf("host_addr : %stfile:%st,%dn",host_addr,file,port); socket_fd = http_tcpclient_create(host_addr,port); if(socket_fd < 0){ printf("http_tcpclient_create failedn"); return NULL; } sprintf(lpbuf,HTTP_GET,file,host_addr,port); if(http_tcpclient_send(socket_fd,lpbuf,strlen(lpbuf)) < 0){ printf("http_tcpclient_send failed..n"); return NULL; } // printf("发送请求:n%sn",lpbuf); if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){ printf("http_tcpclient_recv failedn"); return NULL; } http_tcpclient_close(socket_fd); return http_parse_result(lpbuf); }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10859999
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员