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

📄 gendaemon.c

📁 linux下c 编写的 某项目代理服务端部分的代码。其中包括网络通信
💻 C
字号:
#include "shmmsg.h"/**#define USIZE  32768 */struct comshm *shmp,*GetShm();int msgrcvid,msgsndid;int rcvsock[MAX_BIND];int num;int errno;main(){int  childpid;int semid;int unixrcvbuf,unixsndbuf,bint;void EXIT();int GenDaemon();BINDNO bindno;int newrcvsock[MAX_BIND];int maxsock;int nfds;int alen;fd_set rfds,masterset;struct sockaddr_in fsin;	if (GenDaemon()<0) {		syslog("Run GenDaemon failed !!",__FILE__,__LINE__);		printf("\nRun GenDaemon failed !!\n");		exit(1);	}	signal(SIGCLD,SIG_IGN);	signal(SIGCHLD,SIG_IGN);	signal(SIGTERM,EXIT );	/*memset(bindno,0,sizeof(BINDNO));*/	memset(rcvsock,0,sizeof(int)*MAX_BIND);	memset(newrcvsock,0,sizeof(int)*MAX_BIND);	/*memset(fsin,0,sizeof(struct sockaddr_in));	memset(rfds,0,sizeof(fd_set));*/	if (getrcvport(&bindno) < 0) 		syslog("getrcvport err!",__FILE__,__LINE__);	shmp=GetShm();	if (shmp==NULL) {		syslog("Get share memory err!",__FILE__,__LINE__);		exit(-1);	}	semid=opensem(SEMKEY1);        if(semid <0) {                syslog("get semaphore error!",__FILE__,__LINE__);                perror("get sema error");                exit(-3);        }	num=0;	while ((bindno.bind[num].rcvport != 0)&&(num < MAX_BIND)) {		rcvsock[num]=passivesock(bindno.bind[num].rcvport);		if (rcvsock[num] < 0) {			syslog("bind err!",__FILE__,__LINE__);			exit(-1);		}		num++;	}	num=0;	maxsock=rcvsock[num];	while ((rcvsock[num] != 0)&&(num < MAX_BIND)) {		if (maxsock < rcvsock[num]) 			maxsock=rcvsock[num];		num++;	}	nfds=maxsock+1;	FD_ZERO(&rfds);	num=0;	while ((rcvsock[num] != 0)&&(num < MAX_BIND)) {		FD_SET(rcvsock[num],&masterset);		num++;	}					while(1) {		rfds = masterset;		if (select(nfds,&rfds,(fd_set *)0,(fd_set *)0,					(struct timeval *)0) < 0)			syslog("select error:",__FILE__,__LINE__);		num=0;		while ((rcvsock[num] != 0)&&(num < MAX_BIND)) {			if (FD_ISSET(rcvsock[num],&rfds)) {				alen=sizeof(fsin);				newrcvsock[num] = accept(rcvsock[num],(struct sockaddr *)&fsin, &alen);				if (newrcvsock[num] < 0) {					syslog("not accept!",__FILE__,__LINE__);					continue;				}				/*errno = 0;*/ 		                sem_open(semid);						while ((childpid=fork()) < 0) {					if (errno==EINTR||errno==EAGAIN){ 						errno=0;						sleep(1);						continue;					}					else {						perror("fork err ");						errno=0;						num=0;						while ((rcvsock[num] != 0)&&(num < MAX_BIND)) {						close(rcvsock[num]);						close(newrcvsock[num]);						num++;						}						syslog("forksonerr",__FILE__,__LINE__);                                                sem_close(semid);						exit(-6);					}				}				if (childpid == 0) {					close(rcvsock[num]);					conrcvdeal( newrcvsock[num] );				v_debug("newconrcvdeal [%d]\n",newrcvsock[num]);                                        sem_close(semid);					exit(0);				}				close(newrcvsock[num]);			}			num++;		}	}}			voidEXIT(){	syslog("GenDaemon is killed !",NULL,0);	num=0;	while ((rcvsock[num] != 0)&&(num < MAX_BIND)) {		close(rcvsock[num]);		num++;	}	exit(0);}int getrcvport(BINDNO *bindnop){int count,i;int j=0;	shmp = GetShm();	if (shmp==NULL){		syslog("Get share memory err!",__FILE__,__LINE__);		return(-1);	}	count=shmp->addno;	for(i=0;i<count;i++) {		if (shmp->addstrlist[i].flag != 0) {			bindnop->bind[j].jgbm=0;			bindnop->bind[j].rcvport=shmp->addstrlist[i].rcvport;			j++;		}	}	DtcShm(shmp);	return(0);}

⌨️ 快捷键说明

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