linux下纯C简单的HTTP POST请求 客户端模型.docx
- 文档编号:9371024
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:9
- 大小:19.92KB
linux下纯C简单的HTTP POST请求 客户端模型.docx
《linux下纯C简单的HTTP POST请求 客户端模型.docx》由会员分享,可在线阅读,更多相关《linux下纯C简单的HTTP POST请求 客户端模型.docx(9页珍藏版)》请在冰豆网上搜索。
linux下纯C简单的HTTPPOST请求客户端模型
linux下纯C简单的HTTP POST请求 客户端模型
交代一下故事背景,国内某保险公司,最近上ILOG规则引擎项目,题外话,
对于保险里面的车险核保,真的是相当合适.据说,目前规则引擎最成功的就是ILOG了,我稍微看了一下他们的规则描述语言,感觉好傻啊,用中文描述,我觉得这东西要是可以用导图的那种方式,很发散的方式去处理一定很完美!
回到正题上,因为公司的核心业务系统是使用pro*c编写的服务运行于IBMAIX上面,并且通过中间件与前端通讯,怎么与java的ILOG规则引擎通讯呢?
刚开始想着通过gSoap来实现c对webservice的调用,但最后因为安装这个包肯定得通过系统管理员,相当麻烦,而且从来没有用过,不知道是否好用,所以ILOG那边增加一个DTO转换层,即将我们发送过去的xml转换成webservices调用,并将返回结果也转换成XML;简单的说就是核心后台通过HTTPPOST打包xml发送请求,并且规则引擎那边也返回xml来实现!
晕,走题有点严重!
其实无非要实现有两点,
∙TCP客户端的模型
∙HTTPPOST协议
先来看看我的TCP模型的实现
#ifndef_TUOBAO_TCP_CLIENT_
#define_TUOBAO_TCP_CLIENT_
#include
#include
typedefstruct_tuobao_tcpclient
{
intsocket;
intremote_port;
charremote_ip[16];
structsockaddr_in_addr;
intconnected;
}tuobao_tcpclient;
inttuobao_tcpclient_create(tuobao_tcpclient*,constchar*host,intport);
inttuobao_tcpclient_conn(tuobao_tcpclient*);
inttuobao_tcpclient_recv(tuobao_tcpclient*,char**lpbuff,intsize);
inttuobao_tcpclient_send(tuobao_tcpclient*,char*buff,intsize);
inttuobao_tcpclient_close(tuobao_tcpclient*);
#endif
上面的代码应该也不用说太多,光看这个这些函数的命名也差不多知道嘛意思了
定义一个结构体,有远程IP及端口,连接状态(注:
连接状态是为了保持长连接用的,但事实上post请求的时候,根本就没有保持,所以,基本上没用)
然后是五个tcp函数
tuobao_tcpclient_create:
根据服务器IP或者域名,以及端口填充tcpclient结构,主要是申请个socket及填一下sockaddr_in
tuobao_tcpclient_conn:
连接到远程端口,并修改tcpclient的连接状态
tuobao_tcpclient_recv:
接收远程指定字节数的数据,并分配空间到lpBuf,如果size为0,就阻塞直到连接关闭
tuobao_tcpclient_send:
发送buf,size为buf长度
tuobao_tcpclient_close:
关闭socket并且设置连接状态
好了,直接贴代码算了
tuobao_tcpclient.c
#include
#include
#include
#include
#include"tuobao_tcpclient.h"
#defineBUFFER_SIZE1024
inttuobao_tcpclient_create(tuobao_tcpclient*pclient,constchar*host,intport){
structhostent*he;
if(pclient==NULL)return-1;
memset(pclient,0,sizeof(tuobao_tcpclient));
if((he=gethostbyname(host))==NULL){
return-2;
}
pclient->remote_port=port;
strcpy(pclient->remote_ip,inet_ntoa(*((structin_addr*)he->h_addr)));
pclient->_addr.sin_family=AF_INET;
pclient->_addr.sin_port=htons(pclient->remote_port);
pclient->_addr.sin_addr=*((structin_addr*)he->h_addr);
if((pclient->socket=socket(AF_INET,SOCK_STREAM,0))==-1){
return-3;
}
return0;
}
inttuobao_tcpclient_conn(tuobao_tcpclient*pclient){
if(pclient->connected)
return1;
if(connect(pclient->socket,(structsockaddr*)&pclient->_addr,sizeof(structsockaddr))==-1){
return-1;
}
pclient->connected=1;
return0;
}
inttuobao_tcpclient_recv(tuobao_tcpclient*pclient,char**lpbuff,intsize){
intrecvnum=0,tmpres=0;
charbuff[BUFFER_SIZE];
*lpbuff=NULL;
while(recvnum tmpres=recv(pclient->socket,buff,BUFFER_SIZE,0); if(tmpres<=0) break; recvnum+=tmpres; if(*lpbuff==NULL){ *lpbuff=(char*)malloc(recvnum); if(*lpbuff==NULL) return-2; }else{ *lpbuff=(char*)realloc(*lpbuff,recvnum); if(*lpbuff==NULL) return-2; } memcpy(*lpbuff+recvnum-tmpres,buff,tmpres); } returnrecvnum; } inttuobao_tcpclient_send(tuobao_tcpclient*pclient,char*buff,intsize){ intsent=0,tmpres=0; while(sent tmpres=send(pclient->socket,buff+sent,size-sent,0); if(tmpres==-1){ return-1; } sent+=tmpres; } returnsent; } inttuobao_tcpclient_close(tuobao_tcpclient*pclient){ close(pclient->socket); pclient->connected=0; } 现在来看看http协议的头吧 虽然搞好几年的,但是因为微软为我们封装得太好了,一直没有关注http协议的post头应该是怎么样? 想想,其实很简单,看看人家IE是怎么发出去的就知道了 ubuntu下,先用nc工作监听一下,win下面随便发个请求 html //192.168.1.103/a.b"> 看nc的响应 linbc@cheng-ubuntu: ~/workspace/httpclient$sudonc-l-p80 [sudo]passwordforlinbc: POST/a.bHTTP/1.1 Accept: image/gif,image/jpeg,image/pjpeg,application/x-ms-application,application/vnd.ms-xpsdocument,application/xaml+xml,application/x-ms-xbap,application/x-shockwave-flash,application/vnd.ms-excel,application/msword,application/vnd.ms-powerpoint,**\r\n"; sprintf(post,"POST%sHTTP/1.0\r\n",page); sprintf(host,"HOST: %s: %d\r\n",pclient->remote_ip,pclient->remote_port); sprintf(content_len,"Content-Length: %d\r\n\r\n",strlen(request)); len=strlen(post)+strlen(host)+strlen(header2)+strlen(content_len)+strlen(request); lpbuf=(char*)malloc(len); if(lpbuf==NULL){ return-1; } strcpy(lpbuf,post); strcat(lpbuf,host); strcat(lpbuf,header2); strcat(lpbuf,content_len); strcat(lpbuf,request); if(! pclient->connected){ tuobao_tcpclient_conn(pclient); } if(tuobao_tcpclient_send(pclient,lpbuf,len)<0){ return-1; } printf("发送请求: \n%s\n",lpbuf); if(lpbuf! =NULL)free(lpbuf); lpbuf=NULL; if(tuobao_tcpclient_recv(pclient,&lpbuf,0)<=0){ if(lpbuf)free(lpbuf); return-2; } printf("接收响应: \n%s\n",lpbuf); memset(post,0,sizeof(post)); strncpy(post,lpbuf+9,3); if(atoi(post)! =200){ if(lpbuf)free(lpbuf); returnatoi(post); } ptmp=(char*)strstr(lpbuf,"\r\n\r\n"); if(ptmp==NULL){ free(lpbuf); return-3; } ptmp+=4; len=strlen(ptmp)+1; *response=(char*)malloc(len); if(*response==NULL){ if(lpbuf)free(lpbuf); return-1; } memset(*response,0,len); memcpy(*response,ptmp,len-1); ptmp=(char*)strstr(lpbuf,"Content-Length: "); if(ptmp! =NULL){ char*ptmp2; ptmp+=15; ptmp2=(char*)strstr(ptmp,"\r\n"); if(ptmp2! =NULL){ memset(post,0,sizeof(post)); strncpy(post,ptmp,ptmp2-ptmp); if(atoi(post) (*response)[atoi(post)]='\0'; } } if(lpbuf)free(lpbuf); return0; } intmain(){ tuobao_tcpclientclient; char*response=NULL; printf("开始组包\n"); tuobao_tcpclient_create(&client,"127.0.0.1",80); if(http_post(&client,"/i.php","f1=hello",&response)){ printf("失败! \n"); exit (2); } printf("响应: \n%d: %s\n",strlen(response),response); free(response); return0; } 写个简单的makefile objects=tuobao_tcpclient.ohttppost.o httppost: $(objects) cc-ohttppost$(objects) tuobao_tcpclient.o: tuobao_tcpclient.h httppost.o: .PHONY: clean clean: @echo正在移除 -rmhttppost$(objects) 好了,万事OK了。 。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux下纯C简单的HTTP POST请求 客户端模型 linux 简单 HTTP POST 请求 客户端 模型