1 c语言模拟http请求,这里用于华为sdc相机

1 注意http报头(header)和报文主体间要留有空白行

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

 
 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define MAX_LENGTH 1024
#define SEND_LENGTH 512

/*******************************************************************************
  函 数 名		:  
  功能描述		:域套接字客户端样例代码,自己本地搭建一个简单的SpringBoot微服务;
				代码将请求http://3.200.2.142:8000/index发给服务端域套接字/tmp/http_proxy_connect.socket,
				ngnix代理监听发送到该套接字的请求并负责转发,返回结果。
				注:请求信息结构要符合http请求头格式
  输入参数		:  None
  输出参数		:  None
  返 回 值		:  None
*******************************************************************************/

#define IPSTR_PORT "112.74.80.43:8888"
#define BUFSIZE 1024


int main(int argc,char *argv[])
{
 
 
	
	
    char str1[4096], str2[4096], *str;
	socklen_t len_post;
	memset(str2, 0, 4096);
	
/* 	strcat(str2, "{\"param\":\"{\"aid\":\"1\",\"cid\":\"1\",\"cid_url\":\"11\",\"time_stamp\":\"1\",\"status\":\"1\",\"time_stamp\":\"1\",\"pic_name\":\"1\",\"pic_data\":\"\",\"data\":[{\"frame_id\":\"1\",\"time_stamp\":\"1\",\"alertFlag\":\"1\",\"headInfo\":[{\"x\":123,\"y\":123,\"width\":123,\"height\":123,\"numOfHelmet\":\"1\",\"color\":\"1\"}]}]}}\""); */
	strcat(str2,"{\r\n\"param\":\"{\\\"aid\\\":\\\"1\\\",\\\"cid\\\":\\\"1\\\",\\\"cid_url\\\":\\\"11\\\",\\\"time_stamp\\\":\\\"1\\\",\\\"status\\\":\\\"1\\\",\\\"time_stamp\\\":\\\"1\\\",\\\"pic_name\\\":\\\"1\\\",\\\"pic_data\\\":\\\"\\\",\\\"data\\\":[{\\\"frame_id\\\":\\\"1\\\",\\\"time_stamp\\\":\\\"1\\\",\\\"alertFlag\\\":\\\"1\\\",\\\"headInfo\\\":[{\\\"x\\\":123,\\\"y\\\":123,\\\"width\\\":123,\\\"height\\\":123,\\\"numOfHelmet\\\":\\\"1\\\",\\\"color\\\":\\\"1\\\"}]}]}\"\r\n}");
	str=(char *)malloc(128);
	len_post = strlen(str2);
	sprintf(str, "%d", len_post);
	
	
	memset(str1, 0, 4096); 
	strcat(str1, "POST /api/public/Test  HTTP/1.1\r\nProxy-Connection:keep-alive\r\n");
	strcat(str1, "Host:112.74.80.43:8088\r\n");
	strcat(str1, "Content-Type: application/json;charset=UTF-8\r\n");
	strcat(str1, "Content-Length:");
	strcat(str1, str);
	strcat(str1, "\r\n\r\n");//空白行记得
	
	strcat(str1, str2);
    strcat(str1, "\r\n");
	printf("the client is in\n");
	int sockfd,len,result,byte;
	struct sockaddr_un address;
	//创建socket,指定通信协议为AF_UNIX,数据方式SOCK_STREAM
	if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0))==-1)
	{
		perror("socket");
		exit(EXIT_FAILURE);
	}
	
	//配置server_address
	address.sun_family = AF_UNIX;
	//将地址绑定到nginx监听的域套接字/tmp/http_proxy_connect.socket
	strcpy(address.sun_path, "/tmp/http_proxy_connect.socket");
	len = sizeof(address);
 	printf("The client begin to connect service\n");
	//建立连接
	result = connect(sockfd, (struct sockaddr *)&address, len);
	printf("The connect result from service is %d, %s\n",result, strerror(errno));
	if(result == -1) 
	{
		printf("ensure the server is up\n");
		perror("connect");
		exit(EXIT_FAILURE);
	}
	/*---------------------------------------开始CONNECT连接----------------------------------*/
	//要发给域套接字的请求信息
	//char connectUrl[] = "CONNECT 3.200.6.125:8000 HTTP/1.1\r\nHost:3.200.6.125:8000\r\n\r\n";
	//char connectUrl[] = "CONNECT 192.168.0.100:8888 HTTP/1.1\r\nHost:192.168.0.100:8888\r\n\r\n";
	
	//char connectUrl[] = "CONNECT 192.168.0.100:8888 HTTP/1.1\r\nHost:192.168.0.100:8888\r\n\r\n";
	char connectUrl[] = "CONNECT 112.74.80.43:8088 HTTP/1.1\r\nHost:112.74.80.43:8088\r\n\r\n";
	//存放发送的信息
	char send_buf_connect[SEND_LENGTH];
	//存放收到的信息
	char ch_recv_connect[MAX_LENGTH];
	//用sprintf事先把消息写到send_buf_connect
	sprintf(send_buf_connect,connectUrl);
	printf("The send message is %s and length is %d\n",send_buf_connect,strlen(send_buf_connect));
	//发送请求数据
	if((byte=write(sockfd, send_buf_connect, strlen(send_buf_connect)))==-1)
	{
		perror("write");
		exit(EXIT_FAILURE);
	}
	//接收返回数据
	if((byte=read(sockfd,&ch_recv_connect,MAX_LENGTH))==-1)
	{
		perror("read");
		exit(EXIT_FAILURE);
	}
	printf("receive from server data is: %s\n",ch_recv_connect);

	/*---------------------------------------CONNECT 连接成功----------------------------------*/
	
	/*---------------------------------------开始发送get请求----------------------------------*/
	//要发给代理的请求信息
	//char getUrl[] = "GET /index HTTP/1.1\r\nProxy-Connection:keep-alive\r\nHost:3.200.6.125:8000\r\n\r\n";
	
	//char getUrl[] = "GET /mock/5f599e849ff3095b55ad7f8e/example/mineData HTTP/1.1\r\nProxy-Connection:keep-alive\r\nHost:120.27.128.131:443\r\n\r\n";
	//char getUrl[] = "POST /api/public/Test HTTP/1.1\r\nProxy-Connection:keep-alive\r\nContent-Type: application/x-www-form-urlencoded\r\nHost:112.74.80.43:8088\r\n\r\n";
	//char getUrl[] = "POST /postTest HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded\r\nHost:192.168.0.100:8888\r\n\r\n";
	//char getUrl[] = "GET /index HTTP/1.1\r\nProxy-Connection:keep-alive\r\nHost:192.168.0.100:8888\r\n\r\n";
	//存放发送的信息
	char send_buf_get[SEND_LENGTH];
	//存放收到的信息
	char ch_recv_get[MAX_LENGTH];
	//用sprintf事先把消息写到send_buf
	//sprintf(send_buf_get,getUrl);
	sprintf(send_buf_get,str1);
	printf("The send message is \n%s \n and length is \n  %d\n",send_buf_get,strlen(str1));
	if((byte=write(sockfd, str1, strlen(str1)))==-1)
	{
		printf("write error \n");
		perror("write");
		exit(EXIT_FAILURE);
	}
	if((byte=read(sockfd,&ch_recv_get,MAX_LENGTH))==-1)
	{
		printf("read error \n");
		perror("read");
		exit(EXIT_FAILURE);
	}
	printf("The result from service is: %s\n",ch_recv_get);
	printf("end communication \n");
	/*---------------------------------------get请求结束----------------------------------*/
	close(sockfd);
	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值