2010-08-20 9 views
5

Mon application possède un socket serveur asio qui doit accepter les connexions d'une liste d'adresses IP définie.boost :: asio async_accept Refuser une connexion

Ce filtre doit être fait par l'application, (non par le système), car il peut changer à tout moment (je dois être en mesure de mettre à jour cette liste à tout moment)

Le client doit recevoir un acces_denied Erreur.

Je suppose que lorsque le rappel handle_accept est appelé, SYN/ACK a déjà été envoyé, donc je ne veux pas accepter puis fermer brutalement lorsque je détecte que l'IP connectée n'est pas autorisée. Je ne gère pas le comportement du client, peut-être n'agit-il pas de la même manière quand la connexion est refusée et juste fermée par un pair, donc je veux tout faire nettoyer. (mais c'est ce que j'imagine pour l'instant)

Savez-vous comment je peux faire ça ???

Ma liste d'accès est un conteneur de std :: cordes (mais je peux le convertir en un countainer de quelque chose d'autre ....)

Merci beaucoup

+0

Je pense que vous ne pouvez pas le faire en utilisant asio – gomons

Répondre

4

La méthode async_accept a une surcharge pour obtenir le point de terminaison homologue. Vous pouvez comparer cette valeur à l'intérieur de votre gestionnaire async_accept. S'il ne correspond pas à une entrée dans votre conteneur, laissez le socket sortir de la portée. Sinon, manipulez-le comme requis par votre application.

0

Je ne connais pas les détails de votre application, mais voici comment je le ferais.

Dans le gestionnaire accepter/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 
    } 
}