J'ai le problème suivant à résoudre. Je veux faire un certain nombre de demandes à un certain nombre de serveurs "distants" (en fait, une ferme de serveurs que nous contrôlons). La connexion est très simple. Envoyez une ligne, puis relisez les lignes. En raison du nombre de requêtes et du nombre de serveurs, j'utilise pthreads, un pour chaque requête.Bibliothèque d'E/S réseau simple C/C++
L'approche naïve, utilisant des douilles de blocage, ne fonctionne pas; très occasionnellement, je vais avoir un fil coincé dans 'connect'. Je ne peux pas utiliser SIGALRM parce que j'utilise pthreads. J'ai essayé de convertir le code en O_NONBLOCK mais cela compliquait énormément le code pour lire des lignes simples.
Quelles sont mes options? Je suis à la recherche de la solution la plus simple qui permet à l'pseudocode suivant:
// Inside a pthread
try {
req = connect(host, port);
req.writeln("request command");
while (line = req.readline()) {
// Process line
}
} catch TimeoutError {
// Bitch and complain
}
Mon code est en C++ et j'utilise Boost. Un rapide coup d'œil à Boost ASIO me montre que ce n'est probablement pas la bonne approche, mais je peux me tromper. ACE est loin, beaucoup trop lourd pour résoudre ce problème.
Pourquoi Boost ASIO est-il une mauvaise approche? Je suis d'accord avec ACE (et à moins qu'il n'ait été mis à jour pour utiliser des idiomes C++ modernes, je préfère l'éviter aussi sur cette base!). –
Je pense que Boost ASIO est la mauvaise approche, car il ne semble pas prendre en charge les délais d'attente de connexion ou de lecture/écriture. Est-ce que je me trompe? L'approche standard semble être d'utiliser SIGALRM qui semble inapproprié compte tenu de mon utilisation intensive de pthreads. – ChrisInEdmonton
La question d'un thread par socket de côté, quel est le problème avec pthread-kill()? – Duck