Linux 上写C++ (6)——SOCKET-TCP/IP 模拟HTTP接口

        http协议封装的底层分装的TCP/IP 协议,所以直接用tcp/ip调用的http也是可行的,此方法是整个框架中的最核心的方法的,有了此接口其他的一切都是好说。

//调用动态库,所有的方法调用此函数

string IVR_COMMON::HttpRequest_JSON(char *ip,char *port,char *url,char *strbufsize,char *strtimeout,char *PARAM)

{

        string strPARAM="";

        string response = "";

        char ParamSYS[2048];

        char ParamData[2048];

        int time_ss=0;

        int bufsize=atoi(strbufsize);

        long timeout=atoi(strtimeout);

        int  sockfd, ret, i, h;

        int nSize;

        struct    sockaddr_in servaddr;

        char C_Param[2048];

        string split="|data=|";

        char str1[10240];

//      char str2[102400];

        char buf[10240];

        char GBK_buf[10240];

        char str_len[20];

        socklen_t len;

        fd_set    fdread;

        struct    timeval tv;

        //-----------------------------------------------------------

        string StrPARAM(PARAM);

        string StrParamSYS=        MySplit( StrPARAM, split,0);

        WriteLog("StrParamSYS",StrParamSYS);

        string StrParamData=    MySplit( StrPARAM, split,1);

        WriteLog("StrParamData",StrParamData);

        strcpy(ParamSYS,StrParamSYS.c_str());

        strcpy(ParamData,StrParamData.c_str());   

        //-----------------------------------------------------------

        char stimeout[10]="";

        sprintf(stimeout, "%d", timeout);

        WriteLog("timeout 超时时长",stimeout);

        if((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0)

        {

                  WriteLog("sockfd","获取套接字失败");                  return "";

        }

        bzero(&servaddr,sizeof(servaddr));

        servaddr.sin_family = AF_INET;

        servaddr.sin_port  = htons(atoi(port));

        if(inet_pton(AF_INET,ip,&servaddr.sin_addr) <= 0)

        {     

                  return "IP,Port","ip地址和端口转换失败!";

        }

        if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))< 0 && errno != EINPROGRESS )

        {

                  return "IP,Port","ip地址和端口错误,建立链接失败!";

        }

        WriteLog("IP,Port建立链接OK",ip);

       

        struct linger so_linger;

        so_linger.l_onoff = 1;

        so_linger.l_linger = 0;

  setsockopt(sockfd, SOL_SOCKET,SO_LINGER,&so_linger,sizeof so_linger);

       

        len = strlen(ParamData);

        sprintf(str_len,"%d",len);

        memset(str1,0,10240);

        strcat(str1,"POST ");

        strcat(str1,url);

        strcat(str1,ParamSYS); 

        strcat(str1," HTTP/1.1\n");

        strcat(str1,"Host: ");

        strcat(str1,ip);

        strcat(str1,":");

        strcat(str1,port);

        strcat(str1,"\nContent-Type: application/x-www-form-urlencoded\n");

        //strcat(str1,"\nContent-Type: text/xml\n");  //外围接口对应的  Content-Type 对影响报文解析,即便参数报文正确也会报错

        strcat(str1,"Content-Length: ");

        strcat(str1,str_len);

        strcat(str1,"\n\n");

        strcat(str1,ParamData);

        strcat(str1,"\r\n\r\n");

        //cout<<str1<<"\n";

  WriteLog("REQUEST_PARAM",str1);

        ret = send(sockfd,str1,strlen(str1),0); 

        if(ret < 0)

        {

                  WriteLog("Send message fail","http请求发送失败,原因肯能是传输的参数失败,可以将参数拼成http串,放到浏览器地址栏测试,如果失败,说明借口有问题,需要和CRM那边联调测试");

                  close(sockfd);

                  return "Send message fail";

        }

        WriteLog("Send message Success","http请求发送成功!");

        //FD_ZERO(&fdread);  //长时间调用此方法 就造成内存溢出,多次调试之后将此监听去掉后系统正常

        //FD_SET(sockfd,&fdread);

        while(1)

        {

                  time_ss++;

                  if(time_ss>timeout)

                  {

                            WriteLog("time out",strtimeout);

                            close(sockfd);

                            return "time out";

                  }

                  tv.tv_sec = 0; //超时时长

                 

                  tv.tv_usec = 100000;

                  select(sockfd+1,NULL,NULL,NULL,&tv);

                 

                  WriteLog("time_ss",time_ss);

                 

                  memset(buf,0,10240);

                  memset(GBK_buf,0,10240);

                  i=recv(sockfd,buf,10240,0);

                  if(i>0)

                  {

                            utf82gbk(GBK_buf,  buf);

                            response=response+GBK_buf;

                            //socket 发送字串是按字节发送,如果 内容过长,会分开发送,接口分开取数据 如果找到以下字串表示数据已经接收完成一般情况下,直接一次就完成了

                 

                            string EndFlag=response.substr(response.size()-8,4);

                            string EndFlag1=EndFlag.substr(0,1);

                            string EndFlag2=EndFlag.substr(3,1);

                  //      WriteLog("EndFlag",EndFlag);

                  //      WriteLog("EndFlag1",EndFlag1);

                  //      WriteLog("EndFlag2",EndFlag2);

                    EndFlag=EndFlag.substr(0,1);

                       

                            if(EndFlag1=="}"&&EndFlag2=="0")

                            {

                            // WriteLog("response",response);

                                    WriteLog("select success","OK");

                                    break;

                            }

                            else

                            {

                                    continue;

                            }

                  }

                  if(i <0)

                  {

                            close(sockfd);

                            WriteLog("read","读取返回信息失败,有可能是参数 bufsize 的值过小造成");

                            break;

                  }

        }

        close(sockfd);                           

        WriteLog("SUCCESS","OK");

        return response;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容