直接使用心知天气的域名获取天气信息,并将温度信息转换成整型输出- /**************************************************************************
- *
- * 设计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 PORT 80
- #define DNS "api.seniverse.com"
- #define KEY " "
- #define LOCAL "tianjin"
- int main(int argc,char *argv[])
- {
- char buf[512] = {0};
- char rcvbuf[512] = {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[0]))->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;
-
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |