您的位置:首页 > 理论基础 > 计算机网络

LinuxC编写TCP,HTTP中转SOCKET服务器(模拟)

2017-09-18 11:43 459 查看

使用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';
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 服务器 tcp