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

📄 intercomm.c

📁 我的一段关于Linux/Unix下重复服务器
💻 C
字号:
#include "def.h"extern int timeout;main(){	typedef struct pkg{		int  actlength;		unsigned char dstip[16];		int dstpid;	}pkgtype;	int pid,msgqo,childpid;	int len,len1,len2;	int ptype,i;	int sem=2;	int sockfd;	int newsendfd;	int max;	struct sockaddr_in cli_addr, serv_addr;	unsigned char cliip[15];	unsigned char sstr[28];	int clilen;	int yes=1;	struct timeval tv;	struct linger linger = {0};	fd_set readfds;	M_Dst* pser;	M_Dst sser[10];	pkgtype pkginfo;	unsigned char str[LINELEN];	my_msg tmp_msg;	my_conf serconf;	//	extern void time_out (); 	pser=(M_Dst*)creatshm(sizeof(M_Dst)*10);		initshm(sser,pser);	memset(sser[0].ipaddr,'\0',350);	 	 for (i = 0; i < 32; i++)    	 	if (i != SIGKILL && i != SIGBUS && i != SIGALRM)      			signal (i, SIG_IGN);  	signal (SIGALRM, time_out); 	if ((msgqo= msgget (QUEUE_IN, PERMS | IPC_CREAT)) < 0)    	{		write_log("Can't get message queue QUEUE_SI");		exit(0);	}	write_log("InterComm Server Start... ");  	if((pid=fork()) == -1){		write_log("Fork Error"); 		exit(0);		}	 if(pid)  		exit(0); //parent process exit	init_servinfo(&serconf);	/*Init TCP send port_2 for runmonitor*/	bzero ((char *) &serv_addr, sizeof (serv_addr));	  serv_addr.sin_family = AF_INET;	  serv_addr.sin_addr.s_addr = inet_addr (serconf.serverip);	  serv_addr.sin_port = htons (atoi(serconf.listenport_2));	if ((sockfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)	{		write_log("socket failed");		exit(0);	}	  linger.l_onoff = 0;	  linger.l_linger = 0;	if (setsockopt	//reuse the bind addr	      (sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof (yes)) < 0)	{		close (sockfd);		write_log("setsockopt reuseaddr error!");		exit(0);	}	  if (setsockopt	      (sockfd, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof (linger)) <0)	    {	      close (sockfd);	      write_log("setsockopt linger error!");		  exit(0);	    }	  if (bind (sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) < 0)	 	{		sprintf (str, "addr=[%s]  port=[%s]",		      serconf.serverip,serconf.listenport_2);	 	write_log (str);		close (sockfd);		write_log("bind error!");		exit(0);	}	listen (sockfd, 10);	clilen = sizeof (cli_addr);	while(1){		testsem(SEM_PRO,2);		if((pid = fork()) == -1){			write_log("fork error");			continue;		}		if(!pid) {			sprintf(str,"fork a new child: %d",pid);			write_log(str);			break;		}	}	childpid = getpid();	newsendfd=accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);	printf("runmonitor connected!\n");	if(newsendfd<0)	{		close(newsendfd);		write_log("connect failed");		exit(0);	}	strcpy(cliip,inet_ntoa(cli_addr.sin_addr));	if(!chek_clientip(cliip,&serconf))	//	{		write_log("illegal IP address!");		exit(0);					}	decsem(SEM_PRO);		//father fork new child waiting for new connection	testsem(SEM_SHM,1);		//waiting for write shared memory	addsem(SEM_SHM);		//lock shared memory	if(add_serv_pid(cliip, sser,pser)<0)	//update shared memory	{			write_log("the tsv server overflow");		exit(0);	}	decsem(SEM_SHM);		//unlock shared memory	for(;;){		len = msgrcv (msgqo, &tmp_msg, MAXSIZE, childpid,IPC_NOWAIT );		if(len>12)		{			len2=0;			if ((len1 = send (newsendfd, tmp_msg.mdata+len2, len, 0)) != len ) {					len-=len1;					len2+=len1;			}			continue;		}		FD_ZERO (&readfds);	//砞竚select把计		FD_SET (newsendfd, &readfds);		tv.tv_sec = 1;		//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -