码迷,mamicode.com
首页 > 编程语言 > 详细

C语言访问webservice小例子

时间:2015-07-23 00:22:46      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

  近期做的一个项目中,需要访问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;
    }

 

C语言访问webservice小例子

标签:

原文地址:http://www.cnblogs.com/acool/p/4668981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!