网络编程练习题

网络编程

image

代码

/*************************************************************************************
 *
 *  file name:  1.c
 *  author   : 	lu.ciana.598393@gmail.com
 *  date     :  2024/06/11
 *  function : 	利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送
 *				请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端。
 *  note     :  使用了cJSON库 需下载相关开源代码一起进行编译
 *  CopyRight (c)   2024    lu.ciana.598393@gmail.com   All Right Reserved
 *
 ************************************************************************************/
#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"

#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;
}


结果

image

posted @ 2024-06-11 20:42  luxiaolim  阅读(15)  评论(0)    收藏  举报