目录
网络线程控制代码
mainPro.c
#include <pthread.h>
#include "controlDevice.h"
#include "inputCommand.h"
struct InputCommand *pcommandHead = NULL; //定义指令工厂初始链表头
struct InputCommand *socketHandler = NULL;
void *socketReadThread(void *data) //“读取tcp端口指令线程”执行的函数
{
int n_read;
printf("Connect success\n");
while(1){
memset(socketHandler->command,'\0',sizeof(socketHandler->command));
n_read=read(socketHandler->fd,socketHandler->command,sizeof(socketHandler->command));
if(n_read == -1){
perror("read:");
}else{
printf("Get SocketCommand-->%s\n",socketHandler->command);
}
}
}
void *socketControlThread(void *data) //“网络控制线程”执行的函数
{
int c_fd; //文件描述符
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen = sizeof(struct sockaddr_in);
pthread_t socketRead_thread; //线程里面套线程,网络连接后信息通信
socketHandler = findCommandByName("socket", pcommandHead);
if(socketHandler == NULL){
printf("find socketHandler error\n");
pthread_exit(NULL);
}
if(socketHandler->Init(socketHandler) < 0){ //“网络控制”功能初始化
printf("socketControl init error\n");
pthread_exit(NULL);
}else{
printf("socketControl init success\n");
}
while(1){
//4.accept
c_fd = accept(socketHandler->s_fd,(struct sockaddr *)&c_addr,&clen); //接收连接请求,阻塞至有客户端完成三次握手
socketHandler->fd = c_fd; //将套接字描述符返回给“网络控制”链表节点
pthread_create(&socketRead_thread,NULL,socketReadThread,NULL); //创建新线程:用于读取TCP端口指令
}
}
int main()
{
if (wiringPiSetup () == -1) {
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
pthread_t socketControl_thread;
//指令工厂初始化
pcommandHead = addSocketControlToInputCommandLink(pcommandHead);
pthread_create(&socketControl_thread,NULL,socketControlThread,NULL);
pthread_join(socketControl_thread, NULL); //主函数等待线程退出
return 0;
}
inputCommand.h
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <wiringPi.h>
#include <wiringSerial.h>
struct InputCommand
{
char commandName[128]; //“控制方式”名
char deviceName[128];
char command[32]; //存放指令
int fd; //存放文件描述符(串口/网络)
int s_fd; //存放服务器套接字描述符
char port[12]; //存放端口号
char ipAdress[32]; //存放 IP地址
char log[1024]; //日志
int (*Init)(struct InputCommand *voice); //“初始化”函数指针
int (*getCommand)(struct InputCommand *voice); //“获取指令”函数指针
struct InputCommand *next;
};
struct InputCommand* addSocketControlToInputCommandLink(struct InputCommand *phead);
socketControl.c
#include "inputCommand.h"
int socketInit(struct InputCommand *socketMsg)
{
int s_fd; //套接字描述符
struct sockaddr_in s_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in)); //数据清空
//1.socket
s_fd=socket(AF_INET,SOCK_STREAM,0); //创建套接字,ipv4 tcp协议
if(s_fd == -1){ //若创建套接字失败
perror("socket:");
exit(-1);
}
s_addr.sin_family = AF_INET; //ipv4
s_addr.sin_port = htons(atoi(socketMsg->port)); //端口号,选择5000以上。honts返回网络字节序,atoi(argv[2])防止端口被占用
inet_aton(socketMsg->ipAdress,&s_addr.sin_addr); //转换为网络能识别的格式
//2.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3.listen
listen(s_fd,10);//监听10个连接
printf("socket Server listening ...\n");
socketMsg->s_fd = s_fd; //发送套接字描述符
return s_fd;
}
struct InputCommand socketControl = {
.commandName = "socket",
.command = '\0',
.port = "8080",
.ipAdress = "192.168.3.77",
.Init = socketInit,
.log = {'\0'},
.next = NULL
};
struct InputCommand* addSocketControlToInputCommandLink(struct InputCommand *phead)
{
if(phead == NULL){
return &socketControl;
}else{
socketControl.next = phead;
phead = &socketControl;
return phead;
}
}
测试结果
智能家居项目目录
智能家居(5) —— 智能家居项目整合(语音控制线程,网络控制线程、烟雾报警线程)
网络编程知识预备(2) —— 三次握手与四次挥手、半连接状态、2MSL
网络编程知识预备(3) —— TCP流量控制(滑动窗口)、拥塞控制
网络编程知识预备(4) —— SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(5) —— 了解应用层的HTTP协议与HTTPS协议
网络编程知识预备(6) —— libcurl库简介及其编程访问百度首页
智能家居(7) —— 人脸识别 & 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)
本文含有隐藏内容,请 开通VIP 后查看