Posez votre question Signaler

Ping en C [Résolu]

jfs 3Messages postés 24 octobre 2000Date d'inscription - Dernière réponse le 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); 
}
Lire la suite 

Ping en C »

17 réponses
Réponse
+4
moins plus
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
}

++
Ajouter un commentaire
Réponse
+1
moins plus
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;

}
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
et comment faire cela ? Y a t il unmoyen simple ?

Merci.
Ajouter un commentaire
Réponse
+0
moins plus
tu es génial !!! Un tout tout tout grand merci. Je vais tester ça immédiatement.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
Mets simplement un :
int main()

sans arguments.
Ajouter un commentaire
Réponse
+0
moins plus
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);
}
Ajouter un commentaire
Réponse
+0
moins plus
il te le met à quelle ligne ?
Ajouter un commentaire
Réponse
+0
moins plus
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] ; 

jfs - 2 mai 2005 à 13:43
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;
}
Ajouter un commentaire
Réponse
+0
moins plus
Encore moi mais ça marche maintenant. Un super grand merci pour ton aide :-)))))
Ajouter un commentaire
Réponse
+0
moins plus
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);

?
jfs - 2 mai 2005 à 14:04
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;
}
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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]
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « ping en C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook