Rechercher : dans
Par :

Ping en C

Dernière réponse le 28 déc 2008 à 17:39:46 jfs, le 1 mai 2005 à 20:49:23 
 Signaler ce message aux modérateurs

Bonjour,

Je dois réaliser un programme de ping en C. En fait, les adresse à pinguer sont à lire dans un fichier.
Mon progr les lit, les pingue et les retransfère les pings dans un fichier 2. C'est là qu'est le probl car j'aimerais que seules les adr ip restees sans reponse soient transferees dans le fichier 2.Malheureusement je ne sais vraiment pas comment faire. Si vous aviez une idee, ce serait super sympa. Suis debutant en C.

#include <winsock.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 
#define p 512 
#define ping "ping" 
int main() 
{ 
FILE *fichier; 
FILE *fichier2; 
char n[250], v[250]; 
char commande [p] ; 
fichier = fopen ("fichier.txt","rt"); 
fscanf(fichier, "%s\n%s\n",&n,&v); 
int atoi(char *n); 
int atoi(char *v); 
strcpy(commande, "ping "); 
strcat(commande, n); 
strcat(commande, "> fichier2.txt"); 
system (commande); 
strcpy(commande, "ping "); 
strcat(commande, v); 
strcat(commande, "> fichier2.txt"); 
system (commande); 
fclose (fichier); 
fclose (fichier2); 
exit (0); 
}

Meilleures réponses pour « ping en C » dans :
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Network Ping VoirDans le langage réseau, le PING est le moyen d’envoyer des messages d’un ordinateur à un autre afin de tester le fonctionnement d’une connexion réseau. Network Ping est un utilitaire relié à la fonction ping de votre ordinateur ou...
Télécharger Visual C++ 2008 Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
Caractéristiques du langage C++ VoirLe fichier source Le fichier source d'un programme écrit en langage C++ est un simple fichier texte dont l'extension est par convention .CPP. Ce fichier source doit être un fichier texte non formaté, c'est-à-dire un fichier texte dans sa plus...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

Luffy =), le 1 mai 2005 à 21:35:37

Ben le problème avec la fonction system() c'est que tu n'as pas de retour à propement dit de ce que tu as lancé, que ce soit un ping ou autre.

Donc en gros, si tu es motivé, tu crées carrément une socket, tu fais ton ping toi-même et tu répères ce qui revient sur la socket. Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

2

jfs, le 1 mai 2005 à 23:22:46

Et comment faire cela ? Y a t il unmoyen simple ?

Merci.

Répondre à jfs

3

Luffy =), le 1 mai 2005 à 23:39:01
  • +1

Bon en fait je viens de tester la fonction system(), et elle renvoie une valeur correspondant à la réussite ou non de la commande passée en paramètre. Exemple avec du code :

int _tmain(int argc, _TCHAR* argv[])
{
	printf("Luffy's Ping Test\n");
	int ret=system("ping 127.0.0.0");
	printf("\nResultat : %d\n\n",ret);
	system("pause");
	return 0;
}

là je ping une mauvaise adresse, et le retour est 1.

int _tmain(int argc, _TCHAR* argv[])
{
	printf("Luffy's Ping Test\n");
	int ret=system("ping 127.0.0.1");
	printf("\nResultat : %d\n\n",ret);
	system("pause");
	return 0;
}

là le retour = 0 donc ça a marché.

donc dans ton code, tu inclues un test sur le retour de system()
if (ret==0)
{
//tu écris dans ton fichier
}

++ Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

4

jfs, le 2 mai 2005 à 08:39:39

Tu es génial !!! Un tout tout tout grand merci. Je vais tester ça immédiatement.

Répondre à jfs

5

jfs, le 2 mai 2005 à 09:08:46

Sorry mais j'ai encore un petit probl :
quand j'essaie de compiler, il me dit qu'il y a une erreur au niveau du int _tmain(int argc, _TCHAR* argv[])


Encore merci.

Répondre à jfs

6

Luffy =), le 2 mai 2005 à 09:17:07

Mets simplement un :

int main()

sans arguments. Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

7

jfs, le 2 mai 2005 à 10:13:32

Je suis vraiment désolé mais il me dit à la compil "cannot convert int to char*" Je suis vraiment desole mais je débute ...Voici le code au cas où :



#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define p 512
#define ping "ping"
int main()
{
FILE *fichier;
FILE *fichier2;
char n[250];
char commande [p] ;
fichier = fopen ("fichier.txt","r");
fscanf(fichier, "%s\n",&n);
int atoi(char *n);

strcpy(commande, "ping ");
strcat(commande, n);
system(commande);
if (n==1)
{
fprintf(fichier2, "%s\n",&n);
}
fclose (fichier);
fclose (fichier2);
exit (0);
}

Répondre à jfs

8

Luffy =), le 2 mai 2005 à 11:25:26

Il te le met à quelle ligne ? Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

9

jfs, le 2 mai 2005 à 11:30:33
  • +1

Un tout grand merci à toi. Finalement j'y suis arrivé (du moins 1 partie). Voici le code :



#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <conio.h>
#define p 512
int main()
{
FILE *fichier;
FILE *fichier2;
char n;
char commande [p] ;

fichier = fopen ("fichier.txt","r");
fichier2 = fopen ("fichier2.txt", "w");

fscanf(fichier, "%s\n",&n);

int atoi(char *n);

strcpy(commande, "ping ");
strcat(commande, &n);

int ret = system (commande);


if (ret==1)
{
fprintf (fichier2, "%s\n", &n);
}
system ("pause");
return 0;



Maintenant c'est au moment ou je lui dis de lire les 2 adr qu'il merde :


#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <conio.h>
#define p 512
int main()
{
FILE *fichier;
FILE *fichier2;
char n, v;
char commande [p] ;

fichier = fopen ("fichier.txt","r");
fichier2 = fopen ("fichier2.txt", "w");

fscanf(fichier, "%s\n%s\n",&n,&v);

int atoi(char *n);
int atoi(char *v);


strcpy(commande, "ping ");
strcat(commande, &n);

int ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &n);
}

strcpy(commande, "ping ");
strcat(commande, &v);

int ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &v);
}
system ("pause");
return 0;

}

Répondre à jfs

10

Luffy =), le 2 mai 2005 à 12:33:38

Alors plusieurs petites remarques :

int atoi(char *n); 

tu n'as pas mis de nom variables, donc il ne doit pas compilé. De plus en C, il faut savoir que les variables sont toujours à déclarer au tout début de la fonction. Les nouveaux compilo acceptent, mais dans la norme, c'est mieux de les déclarer et de les itinitialiser avant toute chose.

Ensuite tu déclares 2 fois la variable "int ret", donc po possible, pas 2 variables dans une fonction qui portent le même nom.

sinon je trouve ton code très lisible et propre ! j'aime bien le
#define p 512 
char commande [p] ; 

Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

11

jfs, le 2 mai 2005 à 13:43:45

Rebonjour,

Merci pour ton compliment ;-)) Je t'avoue que c'est mon 1er progr ...d'où toutes mes questions.

Je te remercie encore pour tout ce que tu m'as indiqué.
Si je te suis bien, je ne peux pas utiliser 2 fois la variable int ret. Je peux te demander de regarder encore ceci stp ? :



#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <conio.h>
#define p 512
int main()
{
FILE *fichier;
FILE *fichier2;
char n, v;
char commande [p] ;

fichier = fopen ("fichier.txt","r");
fichier2 = fopen ("fichier2.txt", "w");



fscanf(fichier, "%s\n%s\n",&n, &v);

int atoi(char *n);
int atoi(char *v);

strcpy(commande, "ping ");
strcat(commande, &n);

int ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &n);
}


strcpy(commande, "ping ");
strcat(commande, &v);

int ret2 = system (commande);
if (ret2==1)
{
fprintf (fichier2, "%s\n", &v);
}
system ("pause");
return 0;
}

Répondre à jfs

12

jfs, le 2 mai 2005 à 13:53:34

Encore moi mais ça marche maintenant. Un super grand merci pour ton aide :-)))))

Répondre à jfs

13

Luffy =), le 2 mai 2005 à 13:59:06

Tu n'as pas écouté tout ce que je t'ai dit !!! lol ;-)

Tu peux utiliser la même variable 2 fois, mais il faut la déclarer qu'une seule fois :

int ret=0;
ret=1;

quand tu écris "int ret" on dit que tu déclares ta variable. De la mémoire est allouée pour pouvoir contenir une donnée. donc quand tu refais ret=1; le processeur met la valeur 1 dans la case mémoire réservée pour ret.

et il faut que tu déclares tes variables au tout début de ta fonction, et en leur mettant une valeur nulle pour éviter des erreurs :
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <conio.h>
#define p 512
int main()
{
FILE *fichier=NULL;
FILE *fichier2=NULL;
char n, v;
char commande [p]=NULL ;
int ret=0;

fichier = fopen ("fichier.txt","r");
fichier2 = fopen ("fichier2.txt", "w");



fscanf(fichier, "%s\n%s\n",&n, &v);

int atoi(char *n);
int atoi(char *v);

strcpy(commande, "ping ");
strcat(commande, &n);

ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &n);
}


strcpy(commande, "ping ");
strcat(commande, &v);

ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &v);
}
system ("pause");
return 0;
}



et une question, à quoi te sert :
int atoi(char *n);
int atoi(char *v);

? Le Parisien, il vaut mieux l'avoir en journal !!! :-P

Répondre à Luffy =)

14

jfs, le 2 mai 2005 à 14:04:53

Merci :-)

En fait, voici commetn j'ai fait :



#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>

#define p 512
int main()
{
FILE *fichier;
FILE *fichier2;
char n[250], v[250];
char commande [p] ;

fichier = fopen ("fichier.txt","rt");
fichier2 = fopen ("fichier2.txt", "wt");

printf("Test Ping ResULB\n");

fscanf(fichier, "%s\n%s\n",&n, &v);

int atoi(char *n);
int atoi(char *v);

strcpy(commande, "ping ");
strcat(commande, n);

int ret = system (commande);
if (ret==1)
{
fprintf (fichier2, "%s\n", &n);
}

strcpy(commande, "ping ");
strcat(commande, v);

int ret2 = system (commande);
if (ret2==1)
{
fprintf (fichier2, "%s\n", &v);
}
fclose (fichier);
fclose (fichier2);
system ("pause");
return 0;
}

Répondre à jfs

15

Etienne, le 13 avr 2007 à 17:31:08

Bonjour à tous,
je viens de tomer sur votre discussion et j'ai le même problème que jfs sauf que je dévellope sur un microprocesseur, il faut donc que je crée ma commande ping en entier avec des commandes ICMP.

Savez vous comment fonctionne la commande ping ? J'ai vu que l'ICMP pouvait envoyer des instruction avec des requêtes et des commandes mais concrètement quand on ping une adresse, quel info est envoyée et qu'est-ce qui est répondu ?

Merci d'avance

Répondre à Etienne

16

yesyes, le 10 sep 2007 à 14:35:31

Faire des ping avec system(ping) je trouve ca tres bof !!

ne vaudrait-il mieu pas monter une socket icmp et faire un connect() ??

un peu comme ça :
[code]
int chknet(char * ip)
{
struct sockaddr_in name;
struct hostent * hent;
int sock;
int retour = 0;

/* creaion de la socket en icmp */
if(!(sock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP))) return (-1);
memset(&name,0,sizeof(struct sockaddr_in));
name.sin_family = AF_INET;
name.sin_addr.s_addr = inet_addr(ip);
if(connect(sock,(struct sockaddr *) &name,sizeof(struct sockaddr))==0) retour = 1;
else retour = 0;
shutdown(sock,SHUT_RDWR);
close(sock);
return(retour);
[/code]

Répondre à yesyes

17

 anasre, le 28 déc 2008 à 17:39:46

C koi ok et nok et il ya adresse IP en haut est c ke on choisit ladresse kon veut pui on fai mesurer et pares on fai koi

Répondre à anasre
Collection CommentÇaMarche.net