zoukankan      html  css  js  c++  java
  • C语言访问webservice小例子

      近期做的一个项目中,需要访问webservice获取一些json格式的数据。返回的页面内容只是json格式的数据,并不像实际页面那么复杂。所以不想再引入工具库,直接用socket简单实现了。

      以下代码并不是实际项目源码,是我摘取出来整理成的一个小例子分享给大家。代码本身很容易理解,但是需要一些socket编程和http协议基础。

        #include <stdio.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <errno.h>
        #include <time.h>
    
        int main()
        {
            int sockfd = 0;
            struct sockaddr_in ser_addr;
            char url[1024] = {0};          //请求缓冲区
            char recvbuff[4096] = {0};     //接收缓冲区
            char *data = NULL;              
            struct timeval time = {5,0};
            int ret = 0;
    
            //填充webservice主机信息
            memset(&ser_addr, 0, sizeof(ser_addr));
            ser_addr.sin_family = AF_INET;
            ser_addr.sin_port = htons(80);
            ret = inet_pton(AF_INET, "127.0.0.1", &ser_addr.sin_addr.s_addr);
            if (ret < 0)
            {
                perror("ERROR");
                return -1;
            }
    
            if (ret == 0)
            {
                puts("ERROR:arguments error");
                return -1;
            }
    
            //创建socket
            sockfd = socket(AF_INET, SOCK_STREAM, 0);
            if(sockfd < 0)
            {
                perror("ERROR");
                return -1;
            }
    
            //设置阻塞时间为5s
            ret = setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&time, sizeof(time));
            if (ret < 0)
            {
                perror("ERROR");
                goto end;
            }
    
            //连接webservice
            ret = connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(struct sockaddr));
            if(ret != 0)
            {
                perror("ERROR");
                goto end;
            }
    
            //填充请求url 请求头部其他属性自行添加。每行以换行加回车结束
            snprintf(url, sizeof(url), "GET /test HTTP/1.0\r\n\r\n");
    
            //发起http请求
            ret = send(sockfd, url, strlen(url), 0);
            if (ret < 0)
            {
                perror("ERROR");
                goto end;
            }
            puts("send success");
    
            //页面返回
            ret = recv(sockfd, recvbuff, sizeof(recvbuff), 0);
            if (ret < 0)
            {
                perror("ERROR");
                goto end;
            }
            puts("recv success");
    
            //解析返回页面,将data指针指向数据主体
            data = strstr(recvbuff,"\r\n\r\n");
            data += 4;
    
            //打印页面
            if (data != NULL)
            {
                puts(data);
            }
        end:
            close(sockfd);
            return 0;
        }
  • 相关阅读:
    深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)
    深入比特币原理(三)——交易的输入(input)与输出(output)
    深入比特币原理(二)——比特币密钥地址生成
    [JLOI2013]删除物品
    [POI2007]MEG-Megalopolis
    [HNOI2008]遥远的行星
    [JSOI2008]最大数maxnumber
    [HNOI2008]水平可见直线
    [JSOI2008]星球大战starwar
    [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/acool/p/4668981.html
Copyright © 2011-2022 走看看