?? intercomm.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 + -