#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <termios.h>
#define SERVERPORT 8888
#define BACKLOG 5
#define MAX_CON_NO 10
#define BUFSIZE 1024
static int fd = -1; // sockfd
char sendd[10];
struct sockaddr_in serverSockaddr,clientSockaddr;
char sendBuf[BUFSIZE],recvBuf[BUFSIZE];
int sendSize,recvSize;
int sockfd,clientfd;
int sinSize=0;
int ret;
pid_t pid, sec_pid;
pthread_t read_id, send_id;
struct termios option;
/*
Action:to read command from the stc
return:NULL
*/
void *readthread(void)
{
char recv[64];
fd_set readset;
struct timeval tv;
int ret;
tv.tv_sec = 1;
tv.tv_usec = 0;
while(1)
{
FD_ZERO(&readset);
FD_SET(fd, &readset);
ret = select(fd+1, &readset, NULL, NULL, &tv);
if (ret == 0)
continue;
printf("read data is:");
if(FD_ISSET(fd, &readset)){
memset(recv,0,sizeof(recv));
ret = read(fd, recv, 6); //read the first 5 bytes
printf("%s",recv);
}
printf("\n");
}
printf("this is the end\n");
}
/*
Action: send command to stc
return:NULL
*/
void *sendthread(void)
{
while(1)
{
usleep(100);
if( (strlen(sendd)) == 0)
continue;
write(fd,&sendd,6);
bzero(sendd, strlen(sendd));
}
}
/*
Action:open the serial
desprition: fd-->user get
reuturn:null
*/
int open_serial()
{
fd = open("/dev/ttyUSB0",O_RDWR|O_NONBLOCK);
if(fd < 0)
{
printf("open serial port failed\n");
return -1;
}else {
printf("open serial port succeed\n");
}
memset(&option, 0, sizeof(option));
option.c_iflag = IGNPAR;
option.c_cflag = B4800|HUPCL|CS8|CREAD|CLOCAL;
option.c_cc[VTIME] = 0;
option.c_cc[VMIN] = 6;
ret = tcsetattr(fd, TCSANOW, &option);
if (ret < 0)
{
printf("set serial port failed\n");
return -1;
}else {
printf("set seral port succeed\n");
}
return 0;
}
int socket_build() //establish a socket
{
/*establish a socket*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("fail to establish a socket");
exit(1);
}
printf("Success to establish a socket...\n");
/*init/ sockaddr_in*/
serverSockaddr.sin_family=AF_INET;
serverSockaddr.sin_port=htons(SERVERPORT);
serverSockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&serverSockaddr,sizeof(struct sockaddr))==-1)
{
perror("bind error");
exit(1);
}
printf("Success to bind the socket...\n");
if(listen(sockfd,BACKLOG)==-1)
{
perror("fail to listen");
exit(1);
}
return 0;
}
/*
Action: to server a clicker
return NULL
*/
int server_a_clicker()
{
ret = pthread_create(&read_id, NULL, (void*)readthread, NULL);
if(ret)
{
printf("create read pthread error\n");
return -1;
}
ret = pthread_create(&send_id ,NULL,(void*)sendthread, NULL);
if(ret)
{
printf("create send pthread error\n");
return -1;
}
while(1){ //接受数据,显示
if(recv(clientfd,recvBuf,BUFSIZE,0)==0){
perror("fail to receive data");
close(clientfd);
exit(-1);
}
strncpy(sendd,recvBuf,strlen(recvBuf));
printf("Client:%s\n",recvBuf);
memset(recvBuf,0,sizeof(recvBuf));
}
pthread_join(read_id, NULL);
pthread_join(send_id, NULL);
return 0;
}
int main(int argc,char *argv[])
{
open_serial();
socket_build(); //establish a socket
while(1)
{
printf("begain to accept a clicker...........\n");
if((clientfd=accept(sockfd,(struct sockaddr *)&clientSockaddr, &sinSize))==-1)
{
perror("fail to accept");
exit(-1);
}
printf("Success to accpet a connection request...\n");
printf("Client IP is %s\n",inet_ntoa(clientSockaddr.sin_addr));//client IP
pid = fork();
if(pid < 0) // fork error
{
printf("fork error try again\n");
}
if (pid == 0) //first child
{
sec_pid = fork();
if(sec_pid < 0)
{
printf("second fork error, try again\n");
}
if(sec_pid == 0){ // second child
printf("serving a clicker.....!!!!\n");
server_a_clicker();
} else { //second father
sleep(1);
exit(0);
}
}
printf("wait for first child.......\n");
if(waitpid(pid,NULL,0))
{
printf("wait error\n");
}
printf("first child success to exit\n");
}
}
基于linux系统的物联网服务器设计
最新推荐文章于 2024-06-23 19:07:52 发布