HTTP-获取天气-dns版
直接使用心知天气的域名获取天气信息,并将温度信息转换成整型输出/**************************************************************************
*
* 设计http程序,客户端向心知天气发送获取天气的请求,并解析出收到的温度数据
* author:jindouliu2024@163.com
* date:2025.5.20
* notice:需要填写自己的KEY
*
*
* Copyright (c)2024-2025 jindouliu2024@163.com All right Reserved
* *************************************************************************/
#include<stdio.h>
#include<time.h>
#include <unistd.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include
#include <unistd.h>
#include<netinet/udp.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <pthread.h>
#include <netdb.h>
#define PORT80
#define DNS"api.seniverse.com"
#define KEY " "
#define LOCAL "tianjin"
int main(int argc,char *argv[])
{
char buf = {0};
char rcvbuf = {0};
char *p = NULL;
int temp = 0;
struct hostent *host;
//创建套接字文件
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd == -1){
fprintf(stderr,"socket error errno:%d,%s",errno,strerror(errno));
return 1;
}
host = gethostbyname(DNS);
if(host == NULL){
fprintf(stderr,"gethostbyname error errno:%d,%s",errno,strerror(errno));
return 2;
}
//绑定服务器的端口和地址
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr =((struct in_addr *)(host->h_addr_list))->s_addr;
//申请连接
int flag = connect(socket_fd,(struct sockaddr *)&server,sizeof(server));
if(flag == -1){
fprintf(stderr,"connect error errno:%d,%s",errno,strerror(errno));
return 1;
}
//HTTP协议格式
sprintf(buf,"GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=zh-Hans&unit=c "
"HTTP/1.1\r\n"
"Host:api.seniverse.com\r\n"
"\r\n",KEY,LOCAL);
//双方建立连接
send(socket_fd,buf,strlen(buf),0);
//等待服务器响应
//接收到响应行和相应字段
recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
printf("%s",rcvbuf);
bzero(rcvbuf,sizeof(rcvbuf));
//接受到的响应包体
recv(socket_fd,rcvbuf,sizeof(rcvbuf),0);
printf("%s\n",rcvbuf);
//切割字符串,找到天气数据的子串的地址
p = strstr(rcvbuf,"temperature");
p = strtok(p,"}");
p = strtok(p,":");
p = strtok(NULL,":");//"28"
p +=1;
p = strtok(p,"\"");
//将字符串形式的数据转换成整型
temp = atoi(p);
printf("\n%d\n",temp);
close(socket_fd);
return 0;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]