LinuxC编写TCP,HTTP中转SOCKET服务器(模拟)
来源:互联网 发布:网络女神思瑞 编辑:程序博客网 时间:2024/05/16 08:34
使用LinuxC编写TCP,HTTP多线程中转SOCKET服务器(模拟)
数据传输构造:
1、物联网节点已经将数据传到网关。
2、网关将数据通过TCP协议传到SOCKET中转服务器。
3、SOCKET中转服务器将数据通过HTTP POST传到WEB服务器接口。
此文做的是上述2,3两部分内容。
暂时实现了windows客户端(模拟网关)将数据传至Linux虚拟机服务端,Linux虚拟机服务端将数据回传到windows用Spring boot快速搭建的一个web小接口,有待实际测验。
/*Server*/#include<stdio.h>#include<sys/types.h>#include<netinet/in.h>#include<sys/socket.h>#include<netdb.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<sys/wait.h>#include<errno.h>#include<pthread.h>#define PORT 10086#define MAX_CONN_LIMIT 4#define MAXLINE 1024 int http_post(char *ip,int port,char *page,char *buffer){ //data为要发送的数据 int sockfd,n; char recvline[MAXLINE]; struct sockaddr_in servaddr; char content[4096]; char content_line[50]; sprintf(content_line,"POST /%s HTTP/1.1\r\n",page); char content_host[50]; sprintf(content_host,"HOST: %s:%d\r\n",ip,port); char content_type[] = "Content-Type: application/x-www-form-urlencoded\r\n"; char content_len[50]; char data[50]; sprintf(data,"data=%s",buffer); sprintf(content_len,"Content-Length: %d\r\n\r\n",strlen(data)); //用sprintf函数拼接出请求行和请求头content sprintf(content,"%s%s%s%s%s",content_line,content_host,content_type,content_len,data); if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) printf("create socket(HTTP) error\n"); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(8080); //与8080端口建立连接 if(inet_pton(AF_INET,ip,&servaddr.sin_addr) <= 0) printf("inet_pton error\n"); if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0) printf("create connect(HTTP) error\n"); write(sockfd,content,strlen(content)); while((n = read(sockfd,recvline,MAXLINE)) > 0) //读取web服务器返回的值 { recvline[n] = '\n'; if(fputs(recvline,stdout) == EOF) printf("fputs error\n"); } if(n < 0) printf("read error\n"); close(sockfd);} static void Data_Handle(void *conn_fd);int main(){ int socket_fd,connect_fd; struct sockaddr_in servaddr; char buffer[4096]; int n; socket_fd = socket(AF_INET,SOCK_STREAM,0);//初始化socket if(socket_fd == -1){ printf("create socket error:%s(errno:%d)\n",strerror(errno),errno); return 0; } memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//将IP地址设置为系统自动获取,否则直接写也行 servaddr.sin_port = htons(PORT); int on = 1; setsockopt( socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );//设置地址复用 if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1){ printf("bind socket error:%s(errno:%d)\n",strerror(errno),errno); return 0; } if(listen(socket_fd,MAX_CONN_LIMIT) == -1){ printf("listen socket error:%s(errno:%d)\n",strerror(errno),errno); return 0; } while(1){ printf("waiting for new connection...\n"); connect_fd = accept(socket_fd,(struct sockaddr*)NULL,NULL); if(connect_fd == -1){ printf("accept socket error:%s(errno:%d)\n",strerror(errno),errno); return 0; } //加入多线程 pthread_t thread_id; if(pthread_create(&thread_id,NULL,(void *)(&Data_Handle),(void *)(&connect_fd)) == -1){ printf("create pthread error:%s(errno:%d)\n",strerror(errno),errno); break; } printf("A new connection create!\n"); } shutdown(socket_fd,SHUT_WR); printf("Server shuts down\n"); return 0;}static void Data_Handle(void *conn_fd){ int fd = *((int *)conn_fd); int recv_len; char *recv_data[MAXLINE]; const char *msg_to_client = "Server has received your request!\n"; while(1){ printf("waiting for request...\n"); memset(recv_data,0,MAXLINE); recv_len = read(fd,recv_data,MAXLINE); if(recv_len == 0){ printf("Maybe the client has closed"); break; } if(recv_len == -1){nm printf("read error:%s(errno:%d)\n",strerror(errno),errno); break; } if(strcmp(recv_data,"quit")==0){ printf("Client Quit\n"); break; } printf("read from client : %s\n",recv_data); printf("data:%s\n",recv_data); http_post("192.168.110.1",8080,"helloWorld",recv_data); if(write(fd,msg_to_client,strlen(msg_to_client)) == -1){ break; } } printf("terminating current client_connection...\n"); close(fd); pthread_exit(NULL);}
最终实现效果如下
参考:
http://www.cnblogs.com/nerohwang/p/3602233.html
http://blog.csdn.net/yc0188/article/details/4741871
阅读全文
0 0
- LinuxC编写TCP,HTTP中转SOCKET服务器(模拟)
- 基于TCP socket的HTTP服务器
- 使用Java socket简单模拟HTTP服务器
- LINUXC--TCP的客户端/服务器代码
- TCP通信的服务器(两个客户端通过服务器进行数据中转)
- JAVA编写的使用Socket模拟Http的GET操作
- AVA编写的使用Socket模拟Http的GET操作
- .Net 异步Socket编写的UDP和TCP服务器一
- HTTP服务器模拟(原创)
- Tcp socket程序编写
- TCP/IP协议(Socket)做服务器,HTTP协议做客户端
- TCP/IP协议(Socket)做服务器,HTTP协议做客户端
- Socket与http、tcp客户端与服务器连接的区别!
- Socket与http、tcp客户端与服务器连接的区别!
- Socket与http、tcp客户端与服务器连接的区别!
- Socket与http、tcp客户端与服务器连接的区别!
- Socket与http、tcp客户端与服务器连接的区别!
- java 采用socket模拟HTTP协议发送文件到服务器
- java中的单例模式
- VueJs2.0建议学习路线
- 安装SQL SERVER2016或者2017时 安装程序无法与下载服务器联系 Microsoft R Server
- opus编解码的使用
- Java中常用的查找算法
- LinuxC编写TCP,HTTP中转SOCKET服务器(模拟)
- Hadoop生态系统图
- BZOJ 2434 浅谈Trie树构建Fail树DFS离线线段树查询
- CentOS7下解决yum install mysql-server没有可用包的问题
- MAVEN IDEA SSM框架搭建《二》
- Result从select count(0)中获取结果
- Oracle 开启异步IO
- Java EE开发第四章:JDBC的基本使用
- 小猴子下落