Dans la mesure ou tu veux faire un test de réponse
tu envoie une requete GET, et t'attend sagement la réponse du serveur. S'il est pa d'accord ou s'il est d'accord tu recevra une réponse
HTTP/1.1 200 OK
ou un truc dans le genre, donc tu peux très bien utiliser HttpRequest.
Si tu le fait avec les Sockets tu va devoir lire toi meme ce qui est récupéré et le parser... pas top, enfin pas compliqué non plus cela dit. et il faudra que tu gère le timeout...
Pour la concurrence des 500 tests... les threads.
Le problème c'est que si tu fait ouvrir 500 threads au système comme ca d'un coup... il va pas aimer et va prendre un peu de temps... donc utilise les threads de la pool de threads
ThreadPool a qui tu peux attribuer une tâche.
tu prend une file de nom/ip a tester et tu prend un simple objet (object) que tu instancie pour servir de monitor d'exclusion mutuelle.
dans un premier temps tu instancie la file et y met tous le noms à tester.
Puis tu lance 500 threads de pools avec tous la meme tache (meme délégué de callback).
chacun de ces threads se lock sur l'objet d'exclusion mutuel créé.
(section lock (objet) { ... })
dans ce code locké tu met l'accès à la file ou tu dépile le premier élément à tester.
ensuite en dehors du code locked (après la fin du bloc lock{}) tu fait ton test par httprequest ou socket.
a la fin tu met le resultat dans une file... ou une stack de sortie que tu va locker aussi pour éviter que tout le monde n'écrive lise en meme temps dedans ca t'évitera des déconvenues.
une fois fait, le délégué termine normallement et le thread est "libre" et retourne dans la pool a attendre une nouvelle tâche à accomplir.
avec un thread normal, le code ressemblerais à ca :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
private void Process()
{
string iHost;
bool iResult;
lock (m_LockQuery)
{
iHost = m_Queries.Pop();
}
/// Tes traitements sur l'host obtenu
lock (m_LockResult)
{
iHost = m_Result.Push(new KeyValuePair<string, bool>(iHost, iResult));
}
} |
ici tu remarquera que je met une association host, bool pour les résultats histoire de savoir qui est libre et qui ne l'est pas.
ton autre code qui essaie d'accèder à m_Result pour dépiler les éléments qui s'y trouve et les traiter doit le faire dans un
lock(m_LockResult) { ... }
également sinon tu risque là aussi de sévères déconvenues.
voila sur le principe c'est assez simple
Partager