Y a-t-il un moyen d'obtenir toutes les prises ouvertes à l'aide de C ++ ? Je connais la commande L'idée est d'obtenir la FD d'une prise ouverte par son numéro lsof code> et c'est ce que je cherche, mais comment l'utiliser dans un C ++ application? P>
code> et le code
pid code>. P>
5 Réponses :
Vérifiez la source LSOF? P>
L'URL semble être invalide
Si vous ne voulez pas copier / coller ou réimplément des morceaux du code LSOF, vous ne construisez aucune bibliothèque utile que vous pouvez exploiter, vous pouvez toujours ouvrir un tuyau à un lsof code> processus et parcourir sa sortie. P>
Merci beaucoup, ce sera ma solution de plan-b, de la solution de Billy échoue pour une raison quelconque.
@Kiril: L'essentiel peut être une portabilité. LSOF agendra comment obtenir les données sur une grande variété de systèmes, dont certaines ne fournissent / PROC, et même parmi lesquelles le contenu de / processus peut différer. Néanmoins, si vous n'avez pas besoin de beaucoup de portabilité, puis découpez LSOF en fera beaucoup plus rapidement, et probablement plus simple.
Je n'ai pas besoin de beaucoup de portabilité, l'application n'est censée fonctionner que pour Rhel 4 et 5. Oui, j'ai choisi la réponse de Billy en raison de la performance. En outre, qu'est-ce qui me dérange, c'est que si la version de LSOF est différente de la version, je passe des problèmes, il pourrait y avoir des problèmes avec l'analyse. Mais je vais mettre en œuvre ceci, au cas où la première manière échoue, je vais donc utiliser les deux.
Ouvrez simplement les fichiers In / Proc / Net, comme / Proc / Net / TCP, / Proc / Net / UDP, etc. Pas besoin de faire connaître les sources LSOF. :) p>
Et comment puis-je faire le port de mappage: FD de / proc / net / TCP? Je ne vois pas de telles informations là-bas
Le port est codé hexadé après le : code> de la local_address et de la télécommande in / proc / net / TCP. Vous devez ensuite numériser tout / proc / * / fd à l'aide de readlink () et d'analyser le numéro de ce symbolique, par exemple.
Socket: [1771485] Code> 1771485 est le numéro de l'inode et vous constaterez que le numéro d'inode IN / PROC / NET / TCP (ou tout autre fichier similaire, selon qu'il s'agisse de TCP / UDP et de IPv4 ou IPv6. etc.
La commande Vous pouvez ensuite utiliser popen pour exécuter cette commune dans un processus enfant et lire à partir de sa sortie standard. P> P> lsof code> est préparé spécifiquement de telle sorte qu'il puisse être utilisé à partir d'autres programmes, notamment C, voir la section: Sortie pour d'autres programmes forts> de
homme lsof < / code> pour plus d'informations. Par exemple, vous pouvez appeler
lsof code> avec
-f p code> et il sortira la pid em> des processus préfixés avec
'P' Code>:
in c (ou c ++) Vous pouvez utiliser l'interface La documentation est des pièces de rechange, mais j'ai écrit un test de faible niveau pour voir si je pouvais obtenir des événements chaque fois que quelqu'un a ouvert une nouvelle prise, mais cela n'a pas fonctionné. Cela étant dit, pour répertorier les sockets existants, vous pouvez utiliser le code suivant comme bon point de départ: P>
Je pense que cela est plus propre que d'analyser le Il peut également être plus simple d'utiliser la bibliothèque NetLink_sock_diag code>. Ceci est une prise qui vous donne accès à toutes ces informations. Vous pouvez filtrer sur différents paramètres tels que l'interface que la prise est attachée à. P>
/ proc / net / tcp code> et d'autres fichiers similaires. Vous obtenez la même information, mais cela vient à vous en binaire. P>
libnml code> une couche sur la prise. Il fait de nombreuses vérifications supplémentaires sur tous les appels. Cependant, comme la base
NetLink code> interface, il n'est pas très bien documenté (c'est-à-dire si une liaison est importante, des indicateurs que vous pouvez utiliser avec TCP ou UDP, etc.) La bonne chose est la suivante: vous pouvez toujours lire le source pour mieux comprendre ce qui se passe. p>