嵌入式多路温湿度监控系统(五主控程序之网络侦听线程)
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++;
}
}
}
头文件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++;
}
}
}
相关文章推荐
- 嵌入式多路温湿度监控系统(四主控程序之进程间通信)
- kotlin 开发 android 程序中网络http请求和线程的使用
- 基于socket的Linux网络聊天程序--单线程非阻塞客户端
- NetworkComms网络程序开发笔记(二): 跨线程更新UI
- 2014.11.23聊天程序,网络转载,必须先点击“侦听”,再点击“连接”
- 嵌入式开发板C语言编写之从触摸屏与网络编程不同线程文件描述符的读取
- 嵌入式多路温湿度监控系统(六主控程序+进程间通信处理线程)
- 线程问题——同样的程序,在ubuntu中运行和嵌入式中PID表现不同的原因
- java学习_小程序(四线程断点网络资源下载,即时进度反馈)
- 基于ARM的智能灯光控制系统总结(7-主控端网络监听、连接及控制线程)
- 嵌入式多路温湿度监控系统(九菜单配置程序)
- 基于UDP的单线程网络点对点数据包收发测试程序
- 第03天多线程网络:(02):多图下载程序开子线程下载图片
- 检查究竟哪个程序消耗本地mac的网络流量
- natapp 配置微信小程序开发需要的网络环境
- TensorFlow Lite demo——就是为嵌入式设备而存在的,底层调用NDK神经网络API,注意其使用的tf model需要转换下,同时提供java和C++ API,无法使用tflite的见后
- 网络爬虫程序
- 浅析:setsockopt()改善socket网络程序的健壮性
- 浅析嵌入式程序设计中的优化问题
- Visual C#.Net网络程序开发-Tcp篇(1)