int ISGWIntf::open(void* p) { if (AceSockHdrBase::open(p) != 0) { ACE_DEBUG((LM_ERROR, "[%D] ISGWIntf open failed,ip=%s\n" , remote_addr_.get_host_addr())); return -1; } //ip权限检验暂时取消 if (is_auth() != 0) { return -1; } #ifdef MAX_IDLE_TIME_SEC // 因为需要清理无效连接 加上定时器机制 ACE_Time_Value delay(MAX_IDLE_TIME_SEC,0); ACE_Time_Value interval(MAX_IDLE_TIME_SEC,0); //10 分钟 ACE_Reactor::instance()->schedule_timer(this, 0, delay, interval); ACE_DEBUG((LM_NOTICE, "[%D] ISGWIntf start clean timer,interval=%d\n", MAX_IDLE_TIME_SEC)); #endif return 0; }
/* * Funzione utilizzata per riceve un pacchetto dal client. * Restituisce: * 0 se esiste gia' un pacchetto con quel nome o il numero di versione e inferiore * -1 se raggiunta la quantita' massima di pacchetti * -2 se non e' stato effettuato il login */ int receive_pkg(int mode) { writebuf("(receive)\t %d Ricevo il pacchetto %s\n", req.pid, req.pkg.nome); req.tipo = req.pid; if (check_auth(req.pid, req.pwd) || is_auth(req.pid) != -1) { //Controllo l'autorizzazione con la funzione breve o con la ricerca if (mode == M_ADD) { req.todo = addv(req.pkg.nome, req.pkg.ver); if (req.todo == -1) writebuf("(add)\t\t %d Raggiunta la quantita' massima di pacchetti. %s non inserito [ERRORE]\n", req.pid, req.pkg.nome); else if (req.todo == 0) writebuf("(add)\t\t %d %s Esiste gia' nel server. [ERRORE] \n", req.pid, req.pkg.nome); else { writebuf("(add)\t\t %d %s aggiunto correttamente\n", req.pid, req.pkg.nome); avvisa_push(); //Invio un segnale ai client push } } else { req.todo = update(req.pkg.nome, req.pkg.ver); if (req.todo == -1) writebuf("(update)\t %d %s non e' presente sul server [ERRORE]\n",req.pid, req.pkg.nome); else if (req.todo == 0) writebuf("(update)\t %d %s ver. %d appena inviato e' meno aggiornato di quello nel server [ERRORE]\n", req.pid, req.pkg.nome, req.pkg.ver); else { writebuf("(update)\t %d %s aggiornato correttamente\n", req.pid, req.pkg.nome); avvisa_push(); //Invio un segnale ai client push } } } else { req.todo = -2; writebuf("(receive)\t %d Non autenticato [ERRORE]\n", req.pid); } //Invio il messaggio di risposta msg_send(&req, msgl, msgid); writebuf("(receive)\t %d Report inviato\n", req.pid); return req.todo; }
/* * Controlla l'autenticazione. * Restituisce la posizione in caso di successo * -1 nel caso in cui la password sia sbagliata * -2 se il client e' gia' autenticato * -3 nel caso viene raggiunto il massimo numero di client autorizzabili */ int login(int pid, int pwd) { if (pwd == PASSWORD) { if (is_auth(pid) == -1) { int result; waitS(AUTH_SCRIVI); if (aut->n < AUTH_MAX) { aut->lista[aut->n++] = pid; result = aut->n; result--; } else result = -3; signalS(AUTH_SCRIVI); return result; } return -2; } return -1; }
/* * Richiesta di logout * Restituisce: * 1 in caso di successo * -4 nel caso in caso di fallimento * -5 nel caso in cui il pid non sia presente */ int logout(int pid) { waitS(AUTH_SCRIVI); int i = 0; for (; i < aut->n; i++) { if (aut->lista[i] == pid) { aut->lista[i] = aut->lista[aut->n - 1]; aut->n--; signalS(AUTH_SCRIVI); return 1; } } signalS(AUTH_SCRIVI); // Controllo finale if (is_auth(pid) != -1) return -4; else return -5; }