// //========================================================================= // // This function gets called from time to time when the decoding thread is // awakened by new data arriving. This usually happens a few times every second // struct client * modesAcceptClients(void) { int fd, port; unsigned int j; struct client *c; for (j = 0; j < MODES_NET_SERVICES_NUM; j++) { if (services[j].enabled) { fd = anetTcpAccept(Modes.aneterr, *services[j].socket, NULL, &port); if (fd == -1) continue; anetNonBlock(Modes.aneterr, fd); c = (struct client *) malloc(sizeof(*c)); c->service = *services[j].socket; c->next = Modes.clients; c->fd = fd; c->buflen = 0; Modes.clients = c; anetSetSendBuffer(Modes.aneterr,fd, (MODES_NET_SNDBUF_SIZE << Modes.net_sndbuf_size)); if (*services[j].socket == Modes.sbsos) Modes.stat_sbs_connections++; if (*services[j].socket == Modes.ros) Modes.stat_raw_connections++; if (*services[j].socket == Modes.bos) Modes.stat_beast_connections++; j--; // Try again with the same listening port if (Modes.debug & MODES_DEBUG_NET) printf("Created new client %d\n", fd); } } return Modes.clients; }
// //========================================================================= // // This function gets called from time to time when the decoding thread is // awakened by new data arriving. This usually happens a few times every second // void modesAcceptClients(void) { int fd, port; unsigned int j; struct client *c; int services[6]; services[0] = Modes.ros; services[1] = Modes.ris; services[2] = Modes.bos; services[3] = Modes.bis; services[4] = Modes.https; services[5] = Modes.sbsos; for (j = 0; j < sizeof(services)/sizeof(int); j++) { fd = anetTcpAccept(Modes.aneterr, services[j], NULL, &port); if (fd == -1) continue; if (fd >= MODES_NET_MAX_FD) { close(fd); return; // Max number of clients reached } anetNonBlock(Modes.aneterr, fd); c = (struct client *) malloc(sizeof(*c)); c->service = services[j]; c->fd = fd; c->buflen = 0; Modes.clients[fd] = c; anetSetSendBuffer(Modes.aneterr,fd,MODES_NET_SNDBUF_SIZE); if (Modes.maxfd < fd) Modes.maxfd = fd; if (services[j] == Modes.sbsos) Modes.stat_sbs_connections++; if (services[j] == Modes.ros) Modes.stat_raw_connections++; if (services[j] == Modes.bos) Modes.stat_beast_connections++; if (services[j] == Modes.sbsos) { // Send current traffic, if any, immediately int len; char *sbsmsg = aircraftsToSBS(&len); if (sbsmsg) { write(fd, sbsmsg, len); free(sbsmsg); } } j--; // Try again with the same listening port if (Modes.debug & MODES_DEBUG_NET) printf("Created new client %d\n", fd); } }
void createWorkerProcess( appnetServer *serv ) { char *neterr; int ret,i,j,index; int total_worker = serv->worker_num + serv->task_worker_num; for (i = 0; i < total_worker; i++) { serv->workers[i].send_buffer = sdsempty(); // init mutex pthread_mutex_init( &( serv->workers[i].r_mutex ) , NULL ); pthread_mutex_init( &( serv->workers[i].w_mutex ) , NULL ); for (j = 0; j < serv->reactor_num; j++) { index = i * serv->reactor_num + j; ret = socketpair( PF_UNIX , SOCK_STREAM , 0 , serv->worker_pipes[index].pipefd ); assert( ret != -1 ); printf( "woker_id=%d,pipe_index=%d,pipe0=%d,pipe1=%d \n" , i , index , serv->worker_pipes[index].pipefd[0] , serv->worker_pipes[index].pipefd[1] ); } } for (i = 0; i < total_worker; i++) { serv->workers[i].pid = fork(); if (serv->workers[i].pid < 0) { continue; } else if (serv->workers[i].pid > 0) { for (j = 0; j < serv->reactor_num; j++) { index = i * serv->reactor_num + j; close( serv->worker_pipes[index].pipefd[1] ); anetSetSendBuffer( neterr , serv->worker_pipes[index].pipefd[0] , SOCKET_SND_BUF_SIZE ); anetNonBlock( neterr , serv->worker_pipes[index].pipefd[0] ); } continue; } else { for (j = 0; j < serv->reactor_num; j++) { index = i * serv->reactor_num + j; close( serv->worker_pipes[index].pipefd[0] ); anetNonBlock( neterr , serv->worker_pipes[index].pipefd[1] ); anetSetSendBuffer( neterr , serv->worker_pipes[index].pipefd[1] , SOCKET_SND_BUF_SIZE ); } runWorkerProcess( i ); exit( 0 ); } } }