2010-08-20 16 views
5

La mia applicazione ha un socket di server asio che deve accettare connessioni da un elenco definito di IP.boost :: asio async_accept Rifiuta una connessione

Questo filtro deve essere fatto con l'applicazione, (non da parte del sistema), perché può cambiare in qualsiasi momento (devo essere in grado di aggiornare questa lista in qualsiasi momento)

Il cliente deve ricevere un acces_denied errore.

Suppongo che quando viene richiamato il callback handle_accept, SYN/ACK sia già stato inviato, quindi non si desidera accettare, quindi chiudere brutalmente quando rilevo l'accesso IP est non consentito. Non gestisco il comportamento del client, forse non agisce allo stesso modo quando la connessione viene rifiutata e appena chiusa dal peer, quindi voglio fare tutto pulito. (ma è quello che sto immaginando per il momento)

Sai come posso farlo ???

La mia lista di accesso è un contenitore di std :: stringhe (ma posso convertirlo in un countainer di qualcosa d'altro ....)

ringrazio molto

+0

Penso che non è possibile farlo utilizzando ASIO – gomons

risposta

4

Il metodo async_accept ha un sovraccarico per ottenere l'endpoint peer. È possibile confrontare tale valore all'interno del gestore async_accept. Se non corrisponde a una voce nel tuo contenitore, lascia che lo zoccolo esca dall'ambito. Altrimenti, gestirlo come richiesto dalla tua app.

0

Non conosco i dettagli della tua app, ma questo è come lo farei.

Nel gestore accettare/lambda

void onAccept(shared_ptr<connection> c, error_code ec) 
{ 
    if (ec) { /*... */ } 
    if (isOnBlackList(c->endpoint_)) 
    { 
     c->socket_.async_write(/* a refusal message */, 
     [c](error_code, n) 
     { 
      c->socket_.shutdown(); 
      // c fizzles out of all contexts... 
     }); 
    } 
    else 
    { 
     // successful connection execution path 
    } 
} 
Problemi correlati