Esempio n. 1
0
void ip_process(u8 *buf,u16 len)
{
	IP_HDR *p = (IP_HDR *)buf;
	switch (p->proto)
	{
		case PROTO_UDP:
			udp_process(buf,len);
			break;
		default:
			break;
	}
	
}
Esempio n. 2
0
static void server_process(int max, fd_set* set)
{
    msg_group_t* group;
    struct iphdr* ipHdr;
    vector_t v;
    vector_functor_t f = {
        vector_dummy_dup,
        NULL
    };

    if (!this.use_udp && FD_ISSET(this.remotefd, set)) accept_and_check();
    vector_init(&v, f);
    if (this.use_udp)
    {
        if (FD_ISSET(this.remotefd, set)) udp_process(&v);
    }
    else tcp_process(set, &v);
    ++this.msg_ttl;
    remove_clients(&v, "closed");
    vector_free(&v);
    if (LOCAL_HAVE_DATA(set))
    {
        unsigned char buffer[2048];
        ssize_t readen = 0;

#ifdef WIN32
        ReadFile(this.localfd, buffer, sizeof(buffer), &readen, NULL);
#else
        readen = read(this.localfd, buffer, sizeof(buffer));
#endif
        if (readen > 0)
        {
            ssize_t idx;
            ipHdr = (struct iphdr*)buffer;
            idx = active_vector_lookup(&this.clients, compare_clients_by_local_ip, (void*)(long)ipHdr->daddr, sizeof(ipHdr->daddr));
            if (idx >= 0)
            {
                client_t* client;
                size_t len;
                active_vector_get(&this.clients, idx, (void**)&client, &len);
                group = new_msg_group(buffer, (unsigned short)readen);
                if (group)
                {
                    ssize_t written = send_msg_group(client, group);
                    msg_group_free(group);
                    SYSLOG(LOG_INFO, "send msg length: %ld", written);
                }
            }
        }
    }
}
Esempio n. 3
0
/*****************************************************************************
 Prototype    : main_loop
 Description  : main loop for cam ctrl server
 Input        : CamCtrlSrvEnv *envp  
 Output       : None
 Return Value : static
 Calls        : 
 Called By    : 
 
  History        :
  1.Date         : 2012/4/23
    Author       : Sun
    Modification : Created function

*****************************************************************************/
static Int32 main_loop(CamCtrlSrvEnv *envp)
{
	int 			ret = E_NO;
	Bool			exit = FALSE;
	int				listenSock, udpScok, fdMax;
	fd_set			rdSet;
	UdpProcEnv		udpProcEnv;

	/* alloc buffer for communication */
	envp->transBuf = calloc(1, envp->bufLen);
	assert(envp->transBuf);
	
	/* create socket */
	listenSock = socket_tcp_server(envp->tcpPort, CAM_CTRL_LISTEN_NUM);
	if(listenSock < 0) {
		ERR("create server socket failed");
		return E_IO;
	}
	/* set to non-blocking and use select for wait */
	set_sock_block(listenSock, FALSE);

	/* create udp server socket */
	udpScok = socket_udp_server(envp->udpPort);
	if(udpScok < 0) {
		ERR("create udp server socket failed");
		return E_IO;
	}
	/* set timeout */
	set_sock_send_timeout(udpScok, CAM_CTRL_TIMEOUT);
	set_sock_recv_timeout(udpScok, CAM_CTRL_TIMEOUT);
	udpProcEnv.cmdListenPort = envp->tcpPort;
	udpProcEnv.needReboot = FALSE;

	/* create icam ctrl handle */
	envp->hCamCtrl = icam_ctrl_create(CAM_CTRL_MSG, 0, CAM_CTRL_TIMEOUT);
	if(!envp->hCamCtrl) {
		ERR("create cam ctrl handle failed");
		ret = E_IO;
		goto quit;
	}

	/* init mutex for sync */
	pthread_mutex_init(&envp->mutex, NULL);
	
	/* ignore signal when socket is closed by server */
	signal(SIGPIPE, SIG_IGN); 

	DBG("%s, port %u waiting for connection...", PROGRAM_NAME, envp->tcpPort);

	/* choose max fd */
	fdMax = MAX(listenSock, udpScok) + 1;

	while(!exit) {	
		/* wait data ready */
		FD_ZERO(&rdSet);
		FD_SET(listenSock, &rdSet);
		FD_SET(udpScok, &rdSet);
		
		ret = select(fdMax, &rdSet, NULL, NULL, NULL);
		if(ret < 0 && errno != EINTR) {
			ERRSTR("select err");
			break;
		}

		/* no data ready */
		if(!ret)
			continue;

		/* check which is ready */
		if(FD_ISSET(listenSock, &rdSet)){
			/* accept connection */
			tcp_accept(envp, listenSock);
		}

		if(FD_ISSET(udpScok, &rdSet)){
			/* process udp cmd */
			udp_process(udpScok, &udpProcEnv);
			if(udpProcEnv.needReboot)
				break;
		}	
	}

quit:

	if(listenSock > 0)
		close(listenSock);

	if(envp->hCamCtrl)
		icam_ctrl_delete(envp->hCamCtrl);

	pthread_mutex_destroy(&envp->mutex);

	free(envp->transBuf);

	if(udpProcEnv.needReboot)
		system("shutdown -r now\n");
	
	return ret;
}