Ping en C

Résolu/Fermé
jfs
Messages postés
21
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
8 juin 2005
- 1 mai 2005 à 20:49
 anasre - 28 déc. 2008 à 17:39
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); 
}

15 réponses

jfs
Messages postés
21
Date d'inscription
mardi 24 octobre 2000
Statut
Membre
Dernière intervention
8 juin 2005
2
1 mai 2005 à 23:22
et comment faire cela ? Y a t il unmoyen simple ?

Merci.
2
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
1 mai 2005 à 23:39
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
}

++
2
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;

}

                
2
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]
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
1 mai 2005 à 21:35
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.
0
tu es génial !!! Un tout tout tout grand merci. Je vais tester ça immédiatement.
0
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.
0
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
2 mai 2005 à 09:17
Mets simplement un :
int main()

sans arguments.
0
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);
}

                
0
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
2 mai 2005 à 11:25
il te le met à quelle ligne ?
0
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
2 mai 2005 à 12:33
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] ; 

0
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;
}

    
0
Encore moi mais ça marche maintenant. Un super grand merci pour ton aide :-)))))
0
Luffy =)
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
108
2 mai 2005 à 13:59
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);

?
0
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;
}

    
0
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
0
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
0