网络编程
代码
#include <sys/socket.h>
#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"
/*************************************************************************************
*
* file name: 1.c
* author : [email protected]
* date : 2024/06/11
* function : 利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送
* 请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端。
* note : None
* CopyRight (c) 2024 [email protected] All Right Reserved
*
************************************************************************************/
#define PORT 80
#define IPADDR "203.107.54.210"
#define DATA "2024-6-11"
#define KEY "xxxxxxxxxxx" //自己的私钥
// #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);
}
//4.发起连接请求,等待接受服务器接受连接
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); //服务器地址
int ret = connect(tcp_socket,(struct sockaddr *)&dest_addr,sizeof(dest_addr));
if (ret < 0)
{
fprintf(stderr, "connect error,errno:%d,%s\n",errno,strerror(errno));
exit(1);
}
//用于存储HTTP的请求内容: 请求行 + 请求字段 + \r\n + 请求包体(可选)
char reqbuf[1024] = {0};
sprintf(reqbuf,"GET http://v.juhe.cn/calendar/day?key=%s&date=%s "
"HTTP/1.1"
"\r\n"
"Host:v.juhe.cn\r\n"
"\r\n"
,KEY,DATA);
//5.说明双方建立连接,此时可以利用HTTP协议发送请求信息,并等待服务器的响应 基于请求/响应
send(tcp_socket,reqbuf,strlen(reqbuf),0);
//6.等待服务器的响应
char recvbuf[1024] = {0};
//返回的响应参数和响应包体
recv(tcp_socket,recvbuf,sizeof(recvbuf),0);
//定义堆空间接收包体数据
char *recv_buf=calloc(1,512);
//将包体数据从响应数据中分离出来
recv_buf = strstr(recvbuf,"{");
//进行JSON解析
//1) 先把获取的字符串转换为JSON格式
cJSON * obj = cJSON_Parse(recv_buf);
//2) 把解析之后的JSON格式进行输出,用于调试
printf("%s\n",cJSON_Print(obj));
return 0;
}