Beispiel #1
0
//
//=========================================================================
//
// 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;
}
Beispiel #2
0
//
//=========================================================================
//
// 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);
    }
}
Beispiel #3
0
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 );
		}
	}
}