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; } }
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); } } } } }
/***************************************************************************** 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; }