Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
0
/*
 * 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;
}
Exemple #4
0
/*
 * 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;
}