📄 server.c
字号:
/****************************************************************************** Server beta version 1.0 @ author: WISCOM ******************************************************************************/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <errno.h>#include <sys/select.h>#include <fcntl.h>#include <mysql.h>#include <signal.h>#include <stdarg.h>#include <pthread.h>#include "queue.h"#include "devicelog.h"#include "server.h"#include "logging.h"static char client_ip[16];char msg[1024];extern int sem;extern pthread_cond_t ndone_cond;extern pthread_mutex_t ndone_mutex;int server_sem=0;pthread_cond_t server_cond=PTHREAD_COND_INITIALIZER;pthread_mutex_t server_mutex=PTHREAD_MUTEX_INITIALIZER;struct { int flags; pthread_t tid;}files[20];/*struct eventinfo log; *//************************************************** get the max number in the a and b****************************************************/int max(int a,int b){ if(a>b) return a; else return b;}static char client_ip[16];void exit_server(int signumber){ }/********************************************************************************************************* Initial the sever. the server lisiten in the syslog port and trap port . if the message from the client arrive at the port , the sever analysize the message and transfer it the standart logstyle according to the database. ***********************************************************************************************************/void initserver(int *socketid1,int *socketid2){ int yes=1; struct sockaddr_in server_addr; *socketid1=socket(AF_INET,SOCK_DGRAM,0); setsockopt(*socketid1,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)); bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(DEFAULT_SYSLOG_PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); bind(*socketid1,(struct sockaddr *)&server_addr,sizeof(server_addr)); *socketid2=socket(AF_INET,SOCK_DGRAM,0); setsockopt(*socketid1,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)); bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(DEFAULT_TRAP_PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); bind(*socketid2,(struct sockaddr *)&server_addr,sizeof(server_addr)); }void recmsg(int *socketid){ socklen_t len; int i=0; struct sockaddr_in client_addr; pthread_mutex_lock(&server_mutex); recvfrom(*socketid,msg,1024,0,(struct sockaddr *)&client_addr,&len); memset(client_ip,0,16); strcpy(client_ip,inet_ntoa(client_addr.sin_addr)); for(i=0;i<50;i++) if(files[i].flags==1) break; files[i].flags=2; server_sem=1; pthread_cond_signal(&server_cond); pthread_mutex_unlock(&server_mutex); }void startserver(LinkQueue *Q){ fd_set rset; int socketid1,socketid2, k,maxsockid,i=0; pthread_t threadid[50]; struct eventinfo *log; initserver(&socketid1,&socketid2); logfile("The server has initialized!"); FD_ZERO(&rset); maxsockid=max(socketid1,socketid2)+1; signal(SIGINT,&exit_server); for(k=0;k<50;k++) { files[i].flags=0; } for(;;) { FD_SET(socketid1,&rset); FD_SET(socketid2,&rset); select(maxsockid,&rset,NULL,NULL,NULL); if(FD_ISSET(socketid1,&rset)) { for(i=0;i<50;i++) if(files[i].flags==0) break; if(i==50) { printf("Can not create any more thread!\n"); exit(1); } pthread_create(&(threadid[i]),NULL,(void *)recmsg,(void *)&socketid1); files[i].tid=threadid[i]; files[i].flags=1; pthread_mutex_lock(&server_mutex); while(server_sem==0) pthread_cond_wait(&server_cond,&server_mutex); for(i=0;i<50;i++) if(files[i].flags==2) { pthread_join(files[i].tid,NULL); } server_sem=0; pthread_mutex_unlock(&server_mutex); pthread_mutex_lock(&ndone_mutex); logfile(msg); log=(eventinfo *)malloc(sizeof(struct eventinfo)); getmsg(msg,log); strcpy(log->ip,client_ip); Enqueue(Q,*log); free(log); sem=1; i++; pthread_cond_signal(&ndone_cond);/*inform the thread to store the log*/ pthread_mutex_unlock(&ndone_mutex); } if(FD_ISSET(socketid2,&rset)) { } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -