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

这篇博客展示了如何使用C语言通过socket编程实现服务器与客户端的通信,并利用多线程处理并发连接。它涉及了串口操作、套接字绑定、监听、客户端连接、命令发送与接收,以及线程安全的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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、付费专栏及课程。

余额充值