基于linux系统的物联网服务器设计

8 篇文章 0 订阅
0 篇文章 0 订阅
#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");
    }    
}  



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值