由心知天气服务器响应的实时天气数据并进行JSON解析

news/2024/10/1 23:45:35

由心知天气服务器响应的实时天气数据并进行JSON解析

#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "cJSON.h"#define PORT 80  //端口号
#define IPADDR "116.62.81.138"//地址#define KEY "你注册的心知天气的私钥" // 私钥
#define LOCAL "beijing" //城市int main(int argc, char const *argv[])
{// 1.创建TCP套接字int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);//错误处理if (tcp_socket == -1){fprintf(stderr, "tcp socket error,errno:%d,%s\n", errno, strerror(errno));exit(1);}// 2.发起连接请求,等待接受服务器接受连接struct sockaddr_in dest_addr;dest_addr.sin_family = AF_INET;                // 协议族,是固定的dest_addr.sin_port = htons(PORT);              // 服务器端口,必须转换为网络字节序dest_addr.sin_addr.s_addr = inet_addr(IPADDR); // 服务器地址//ret用来进行下一步的connect连接是否成功进行判断int ret = connect(tcp_socket, (struct sockaddr *)&dest_addr, sizeof(dest_addr));//ret = 0连接成功,ret = -1连接失败if (ret < 0){fprintf(stderr, "connect error,errno:%d,%s\n", errno, strerror(errno));exit(1);}// 3.用于存储HTTP的请求内容: 请求行(HRI+(空格))+ 请求字段 + \r\n + 请求包体(可选)+\r\nchar reqbuf[1024] = {0};sprintf(reqbuf, "GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=%s&language=en&unit=c ""HTTP/1.1""\r\n""Host:api.seniverse.com\r\n""\r\n",KEY, LOCAL);// 4.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应  基于请求/响应send(tcp_socket, reqbuf, strlen(reqbuf), 0);// 5.等待服务器的响应char recvbuf[1024] = {0};recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第一次返回的响应参数printf("%s", recvbuf);bzero(recvbuf, 1024);recv(tcp_socket, recvbuf, sizeof(recvbuf), 0); // 第二次返回的响应包体printf("%s\n", recvbuf);// 6.对响应包体进行JSON解析// 1) 先把获取的字符串转换为JSON格式cJSON *obj = cJSON_Parse(recvbuf);// 2) 把解析之后的JSON格式进行输出,用于调试printf("%s\n", cJSON_Print(obj));// 3) 对JSON格式进行解析cJSON *results = NULL;results = cJSON_GetObjectItem(obj, "results");printf("array size = %d\n", cJSON_GetArraySize(results));// 4)对城市的实时温度数据进行解析cJSON *result = NULL;cJSON_ArrayForEach(result, results){cJSON *now = cJSON_GetObjectItem(result, "now");cJSON *temperature = cJSON_GetObjectItem(now, "temperature");printf("temperature : %s\n", temperature->valuestring);printf("temperature : %d\n", atoi(temperature->valuestring));}return 0;
}

所需文件
image

编译

gcc JSON.c cJSON.c -o JSON

运行指令(在当前路径)

./JSON

运行结果
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44924.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2024.6.17鲜花/错误的号码

XY 星的星际新闻报一直不太畅销,所以报纸上会有一些广告,毕竟星际新闻局的非机器人员工也得吃饭。 有一则广告是这样的:【数据删除】研学基地位于【数据删除】,该研学基地致力于让学生体验一个幻想纪前的生活并培养学生不借助现代高科技的群居生活能力。该研学基地将于幻想…

红日靶场3

环境搭建 拿到靶场有5台机子,配置网段,仅主机模式网段vmnet2网段为192.168.93.0即可,出网网卡设置为桥接即可,点击继续运行即可 注意的是web机的两台linux开启后记得拍快照,web机隔一段时间web服务会出问题 web渗透 主机发现(我的桥接网段是192.168.1.0) namp -sP 192.168…

2024/6/9

今天写数据库的实验五,使用Java写了一个十分简易的数据库,连输入都没有,只是证明我用Java连上了sqlserver,代码如下:import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLExc…

2024-06-17-Spring 源码阅读(三)Bean 的生命周期

由于 Spring 源码非常多,博客中贴源码会占用大量篇幅,阅读困难。详细分析部分会以 commit 提交形式关联源码提交,画图例来说明源码整体逻辑。 Bean 生命周期主体逻辑 相关代码:Bean的基本创建流程、lazyInit、循环依赖 Bean 对象创建基本流程 通过最开始的关键时机点分析,…

C# TEKLA 二次开发 版本兼容性解决方案

制作的exe程序,就存在版本兼容性问题 用2022 api编译的exe在2024 中无法启动 解决方案 将exe放在如下位置从此处启动exe即可从宏中可以获取string XSDATADIR = ""; TeklaStructuresSettings.GetAdvancedOption("XSDATADIR", ref XSDATADIR);string extens…

欢迎 Stable Diffusion 3 加入 Diffusers

作为 Stability AI 的 Stable Diffusion 家族最新的模型,Stable Diffusion 3 (SD3) 现已登陆 Hugging Face Hub,并且可用在 🧨 Diffusers 中使用了。 当前放出的模型版本是 Stable Diffusion 3 Medium,有二十亿 (2B) 的参数量。 针对当前发布版本,我们提供了:Hub 上可供下…

前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化

这一章解决两个缺陷,一是调整一些快捷键,使得 Mac 触摸板可以正常操作;二是修复一个 Issue,使得即使素材节点即使被旋转之后,也能正常触发磁贴对齐效果,有个小坑需要注意。这一章解决两个缺陷,一是调整一些快捷键,使得 Mac 触摸板可以正常操作;二是修复一个 Issue,使…