Lorsque j'utilise RECV à partir de Sockets Windows utilise Recv peut conduire à un refus d'attaque de service? S'il attend les données pour toujours? Alors quelle est la meilleure façon de résoudre ce problème (alarmes?) P>
Merci et Cordialement, P>
Mousey. P>
3 Réponses :
Vous semblez mal comprendre ce que le déni de service signifie. Un exemple serait un grand nombre de demandes HTTP à un seul serveur Web arrivant à un taux tel que le logiciel Web-Server devient tellement occupé qu'il ne peut pas accepter de nouvelles connexions TCP. Wikipedia a un article décent sur DOS , lisez-le. P>
RECV (2) code> est juste une API. Utilisation abusive, comme tout autre bogue, peut conduire à des problèmes, y compris DOS. Mais cela ne signifie pas que vous devriez l'éviter. Si votre problème bloque d'autres sockets en attendant une lecture, regardez dans
Sélectionnez (2) CODE>
, sondage (2) code>
et Epoll (4) code> . P>
Oui, je veux savoir si j'utilise recv () peut-il conduire à DOS? Puisque le serveur peut attendre pendant une longue période. Par exemple, si ma taille de message est très grande.
Remarque qui peut définir un délai d'attente sur la prise et une taille tampon maximale sur RECV, de sorte que les possibilités d'abus peuvent être limitées. Je suppose que si vous avez un processus unique, un pair indésirable pourrait vous envoyer beaucoup d'octets lentement comme un déni d'attaque de service ...
Oui, RECV () code> peut bloquer indéfiniment. Vous devez mettre en œuvre une sorte de temps. P>
Si vous utilisez des prises de blocage, recherchez les délais d'envoi () et RECV () avec le SO_SNDTimeo et SO_RCVTimeo Setsockopt () options. p>
Il y a beaucoup de petites complexités dans la création d'un serveur approprié, je vais chercher à acquérir en mendiant, en empruntant ou en volant celui-ci. Voici un Exemple de serveur de prise multithreaded . P>
Également si vous avez la lutte contre les deux côtés (le logiciel de la prise du client et du serveur), je créerais un protocole qui a la longueur du message à transmettre en tant que 2 ou 4 premiers octets du message, de cette façon vous venez de doivent bloquer pour cela décoder le nombre et continuer à lire jusqu'à ce que le nombre d'octets soit écoulé. Faites-le pour le client et le serveur et cela rendra votre code beaucoup plus simple. P>