近期做的一個項目中,需要訪問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;
}