7
votes

Supprimer le système ("ping") sortie en C ++

J'ai écrit un programme simple qui pive trois sites puis réagit à s'ils sont accessibles ou non.

Ma question est la suivante: puis-je supprimer le système ("ping") de la sortie? J'ai écrit mon code en C ++ comme je sais que la langue est la meilleure. Actuellement, le code ouvre la commande ping.exe exécutant la commande système. Si je peux empêcher la sortie de s'afficher pendant qu'il plonge toujours qui serait idéal.

Je vais éventuellement transformer ce programme dans un service Windows, c'est pourquoi je voudrais supprimer à la fois la fenêtre de la console de ligne de commande et supprimer la sortie Ping. Merci.


4 commentaires

Une application Win32 n'est-elle pas (avec WinMain ()) empêchant la ligne de commande d'apparaître?


Je ne sais pas de supprimer la sortie, mais de Pinging est l'une de ces situations où vous éviterez généralement le système ().


@muntoo: appeler un programme de console signifie qu'il a besoin d'une console; Les programmes de console ont un drapeau spécial sous le format PE de Windows, de sorte qu'ils sont légèrement différents.


J'aimerais savoir comment ping sans utiliser le système ping, mais je suis assez nouveau à la programmation et que ce que j'ai trouvé en ligne a été extrêmement confus au mieux :(


6 Réponses :


3
votes

Vous pouvez utiliser la commande système comme ci-dessous pour supprimer la sortie de la commande PING.

system("ping 100.100.100.100 > response.dat");


1 commentaires

Merci Bjskishore, il est très bon de savoir comment je peux envoyer la sortie au fichier si nécessaire.



20
votes

Essayez de faire Système ("ping hôte> nul") ( nul est l'équivalent Windows de Unix / dev / null ).


9 commentaires

Si seulement je pouvais vous marquer comme une réponse ... mais malheureusement, je n'ai pas posé la question.


Pas besoin pour le côlon, "Nul" est assez suffisant.


Merci, cette réponse est très succincte et géniale.


@ Samuel, @ zvrba: Je peux mettre un exécutable malveillant nommé ping.exe et votre programme serait vissé. Vous ne devriez presque jamais utiliser system () : Cplusplus.com/forum / Articles / 11153 Si vous faites un service Windows, la situation est au moins deux fois plus mauvaise.


@Lie: 1) Je devine rarement l'OP. Il a eu la réponse à sa question. 2) Si votre système est compromis, vous êtes vissé quelle que soit la méthode de frai que vous utilisez et que vous traitez. Alors, quel est votre point de vue?


@ZVRBA: Même si son exécutable a une autorisation exécutée uniquement (c'est-à-dire que vous ne pouvez pas compromettre l'exécutable), mais si le répertoire actuel du programme est un répertoire que tout le monde a un accès en écriture à (ce qui est assez souvent le cas), puis Vous n'avez pas besoin d'un système compromis pour remplacer ping.exe avec un programme malveillant.


@Lie: um, un exécutable inconnu est donc par certains moyens (sans importance que signifie) déposé dans un répertoire et attend pour être exécuté. Alors, comment voudriez-vous appeler cela si un système non compromis?


@ZVRBA: Il s'agit d'un scénario courant dans tout système partagé. Si l'un de vos utilisateurs à faible privilège peut écrire dans ce répertoire, ils peuvent obtenir les privilèges de votre programme; Dans un autre mot, si vous utilisez un appel système (), vous divulguez le privilège de votre programme à tout le monde sur le système. À moins que vous ne puissiez bien faire confiance à tous vos utilisateurs (qui est jamais le cas dans un système partagé, sauf si vous êtes délirant), votre programme utilisant System () est un danger de sécurité.


@ZVRBA: Cet argument particulier à propos d'utilisation du système () est discutable si le programme que vous écrivez est censé être exécuté par l'utilisateur lui-même, car les programmes que vous exécutez vous-même utiliseront votre propre privilège (sauf configuration contraire de l'administrateur système) ; Mais l'OP écrit un service Windows, ce qui signifie que le programme est très susceptible d'avoir un niveau de privilège différent de celui de l'utilisateur actuel, c'est une considération de sécurité réelle.



2
votes

Do System ("Ping Site.com> Nul 2> Nul"); et vérifiez la valeur que les retours shell. Si le ping réussit, la coquille retournera 0, sinon cela retournera 1. Je serais plus détaillé, mais Vis Studio se réinstallent. :)

Il existe également un moyen de masquer la fenêtre de la console à l'aide de l'API Win pour exécuter la commande, mais ... Je ne me souviens pas des détails.

EDIT: J'attends toujours le processus d'installation des MSVS, alors ... :) Utilisez CreateProcess avec le drapeau détaché_process pour le paramètre DwcreationFlags pour masquer la fenêtre de la console.

Après avoir appelé Créer un processus, vous devez utiliser WaitforSingleObject sur la poignée de processus pour attendre que le ping se termine. Le dernier paramètre de créationProcess devrait avoir un pointeur pour traiter les informations contenant la poignée de processus. (En supposant que CreateProcess ait réussi), vous devez attendre que la commande soit terminée. Une fois que c'est complet, vous pouvez utiliser la poignée de processus pour obtenir la valeur de retour, bien que je suis trop de temps à vous dire pour vous indiquer comment faire cela à ce stade.


1 commentaires

Merci pour votre réponse, j'aimerais beaucoup de cacher la fenêtre de la console, ce serait génial.



6
votes

Généralement, si vous allez appeler un autre programme mais que vous ne voulez pas qu'il agisse comme STD :: System , vous allez avoir besoin d'une fonction spécifique à la plate-forme comme Fourchette () / exécuté () sur UNIX ou CreateProcess () sous Windows. Ces fonctions vous permettent de contrôler la manière dont l'autre programme fonctionne, par exemple, qu'il ne montre pas la sortie ou non créer une fenêtre de console, etc.


0 commentaires

2
votes

Lorsque vous arrivez à Windows et appelez CreateProcess ( ) , assurez-vous de définir:

    lpStartupInfo->wShowWindow = SW_HIDE;


2 commentaires

Quelle bibliothèque est lpstartupinfo sous?


Salut Samuel. LPSTARTUPInfo est le deuxième paramètre à la fonction CreateProcess (). Veuillez consulter la documentation de la fonction pour les détails (voir le lien dans mon message d'origine).



2
votes

Vous pouvez également utiliser de cette façon, cela retournera la sortie dans un fichier et ne montrera pas une fenêtre de console et gèle l'application principale qui est vraiment utile. Au début, vous devez inclure l'en-tête Windows à l'aide de Windows en utilisant; xxx pré>

puis envoyez une commande ping et écrivez la sortie dans un fichier comme celui-ci; p> xxx pré> P> Ceci va envoyer une commande ping à google.com et écrit la sortie dans le fichier "File.DAT" dans le répertoire de votre programme d'exécution actuel. Vous pouvez donc changer de fichier.dat vers n'importe quel fichier ou fichier fichier que vous souhaitez et bien sûr, vous pouvez modifier la commande ping. Le caractère> signifie que la sortie de la commande doit être écrite dans le chemin de fichier derrière elle. Si vous souhaitez afficher la fenêtre de la console et geler l'application lors de l'exécution de la commande ping, vous devez utiliser la ligne de code suivante au lieu du code Windexec (); p>

system("ping google.com > file.dat");


0 commentaires