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