2017-01-10 2 views
1

J'ai un boost::asio::ip::tcp::socket et je veux déterminer si le socket contient des données qui sont disponibles à lire. Je lis à propos de available(), mais cette fonction renvoie parfois aussi 0 s'il y a des données disponibles (dans le cas où il peut être lu sans blocage). L'exécutable s'exécute sous Ubuntu - un appel système peut-être utile?Déterminer la quantité d'octets disponibles dans le socket

+0

Si aucune donnée n'est disponible pour une lecture, je continuerai et reviendrai plus tard. Je sais que async_read résoudrait cela aussi, mais j'ai déjà une grosse boucle d'interrogation donc ce serait parfait s'il y avait un moyen simple de vérifier les octets disponibles. – Bobface

+0

Au Downvoter: Pourquoi avez-vous downvote? Puis-je ajouter des informations plus importantes? – Bobface

+0

Comme vous l'avez dit, j'ai tout besoin de savoir si une socket contient des données lisibles. Y a-t-il une fonction pour le faire? – Bobface

Répondre

2

Puisque vous avez juste besoin de savoir si le socket contient des données lisibles, il suffit d'émettre votre read non-bloquant à partir du socket. S'il y a des données, vous devez les lire quand même, alors essayez simplement la lecture.

Si vous essayez d'éviter le coût d'un read s'il n'y a rien à lire, sachez que vous venez d'ajouter une opération supplémentaire. Vérifier s'il y a des données à lire n'est pas beaucoup moins cher que d'essayer de lire.

Bien sûr, il suffit d'avoir un async_read en attente. Cela permet au réacteur de Boost de faire son travail.