近期做的一个项目中,需要访问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; }
时间: 2024-10-14 05:53:07