2010-12-08 4 views
5

J'implémente un serveur qui accepte de nombreuses connexions simultanées.est gen_tcp: Accepter/1 Coffre-fort?

J'ai utilisé cette structure:

loop(Sock) -> 
    case gen_tcp:accept(Sock) of 
     {ok, CSock} ->  
      fork_handling_process(CSock); 
     {error, Reason} -> 
      do_something_else(); 
    end, 
    loop(Sock). 

Je me demande si quelqu'un me envoie un SYN, mais ne me envoie un SYN ACK en réponse à mon serveur ACK, sera mon serveur bloqué à jamais par ce client depuis J'appelle gen_tcp: accepter sans timeout? Au fait, je pense que cette situation est difficile à émuler, alors s'il vous plaît laissez-moi savoir si vous avez des façons de l'essayer.

Thx à l'avance.

Répondre

4

Lorsque vous écoutez/accepter son un peu différent que vous décrivez:

Certains client veut se connecter: il envoie un SYN, votre système d'exploitation envoie un SYN/ACK (Erlang pas involvled), lorsque vous obtenez l'ACK gen_tcp: accept reviendra. Quand quelqu'un vous envoie SYN et rien d'autre (ce serait une attaque SYN flood si elle est faite en grande quantité) alors les ressources du système d'exploitation seront réservées mais rien ne se passe dans votre code erlang parce qu'une poignée de main à trois voies n'est pas encore terminée .

De nombreux systèmes d'exploitation accordent une attention particulière aux attaques SYN flooding, évitant ainsi une trop grande consommation de ressources.

0

L'approche que vous utilisez semble être correcte. Votre serveur ne bloquera pas. Si quelque chose ne va pas, je crois que votre processus fourchu recevra l'erreur, pas le serveur.