⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 接收端的程序
💻 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 + -