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

嵌入式多路温湿度监控系统(五主控程序之网络侦听线程)

2017-10-03 15:55 162 查看
该线程负责侦听网络中有没有客户端请求连接,如果有且目前已连接的客户端小于2个,则新建一个接收客户端数据的线程,接收来自网络客户端的温湿度数据,反馈给主控程序。在本项目中网页中显示的第3路、第4路就是网络客户端的数据

头文件net_pro.h

#ifndef __TC9000_NET_H_
#define __TC9000_NET_H_

#define DEF_PORT_8848 8848

int socket_init(int port);//网络初始化
void* client_pro(void* arg);//响应网络客户线程
void* net_pro(void* arg);//服务端处理线程

#endif

实现文件net_server.c
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>

#include "config.h"
#include "net_pro.h"

int net_user;//网络接入数
extern int g_net_port;//引用网络端口
extern struct st_sys g_dev[1]; //引用系统配置结构体全局变量

int socket_init(int port)
{
int sockfd;
struct sockaddr_in server_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}
printf("socket...\n");
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(g_net_port);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
printf("bind...\n");
if(listen(sockfd,10)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
printf("listen...\n");

return sockfd;
}

void* client_pro(void* arg)
{
float temp;
int fd,*p;
int index = net_user+1;
int len;
unsigned char data[4];
p=(void*)arg;
fd = *p;
g_dev->status[index] = 1;
while(1){
len = recv(fd,data,1,0);
if(len==0 || len==-1){
net_user--;
close(fd);
g_dev->status[index] = 0;
pthread_exit("0");
}else{
g_dev->temp_data[index]= data[0];
}
sleep(1);
}
}

void* net_pro(void* arg)
{
pthread_t pth;
int sockfd,new_fd,sin_size;
struct sockaddr_in client_addr;

printf("net server pthread start...\n");
sockfd = socket_init(DEF_PORT_8848);
printf("sockfd=%d\n",sockfd);
while(1){
printf("accept before...\n");
sin_size=sizeof(struct sockaddr_in);
new_fd=accept(sockfd,(struct sockaddr*)(&client_addr),&sin_size);
if(new_fd==-1){
fprintf(stderr,"Accpet error:%s\n\a",strerror(errno));
pthread_exit("0");
}
fprintf(stderr,"Sever from %s\n",inet_ntoa(client_addr.sin_addr));
if(net_user<2){
pthread_create(&pth,NULL,client_pro,(void*)&new_fd);
net_user++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐