begin process at 2010 02 09 22:27:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > PING (ICMP ET RAW SOCKET) DEV-CPP

PING (ICMP ET RAW SOCKET) DEV-CPP


 Information sur la source

Note :
9,56 / 10 - par 9 personnes
9,56 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Niveau :Initié Date de création :16/06/2003 Date de mise à jour :17/06/2003 10:40:21 Vu / téléchargé :11 549 / 1 727

Auteur : roswell117

Ecrire un message privé
Commentaire sur cette source (42)
Ajouter un commentaire et/ou une note

 Description

C'est un programme destiné à faire des requetes ICMP, une copie qui se veut la plus proche de la commande 'ping' de MS-DOS.
Les options de base sont implémentées, mais elles doivent etres mises dans l'ordre :
-t  pour faire tourner le prog à l'infini
-a pour utiliser la résolution de nom
-n pour spécifier le nombre de requêtes à envoyer
-w pour spécifier le temps d'attente de la réponse

Source

  • pas de code car tout est dans le zip !!!
pas de code car tout est dans le zip !!! 

 Conclusion

Je comptes l'améliorer en utilisant getopt() pour gérer les options de la ligne de commande.
Je vais aussi rajouter une option qui permet de spécifier la taille des paquets.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • Makefile.winTélécharger ce fichier [Réservé aux membres club]748 octets
  • pingueur.cTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 685 octets
  • Pingueur.devTélécharger ce fichier [Réservé aux membres club]857 octets
  • Pingueur.exeTélécharger ce fichier [Réservé aux membres club]35 102 octets
  • Pingueur.layoutTélécharger ce fichier [Réservé aux membres club]112 octets
  • pingueur.oTélécharger ce fichier [Réservé aux membres club]8 608 octets

Télécharger le zip


 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

Commentaires et avis

Commentaire de ivdz le 16/06/2003 17:29:11

Très bonne source. On se croirait sous DOS.

Commentaire de Skyman le 16/06/2003 22:05:24

JOULIIII !!!!
Bravo, c'est parfait je pense qu'on peut pas vraiment l'ameliorer ca vaut bien 9/10
(meme si perso je pige pas tout ;)

Commentaire de Nebula le 17/06/2003 09:29:12

Excellent, çà m'a permis de capter (enfin ! lol) les raw sockets.

Une seule petite remarque :
    phe = gethostbyname(hostname);
    if(!phe)
    {
        printf("hote inconnu %s
",hostname);
        return -1;
    }
Ce test est justifié car en cas d'erreur sur l'host tu quittes le programme, mais pourquoi après continuer à faire des if(phe) ?

Sinon à part çà excellent programme, bravo :p

Commentaire de roswell117 le 17/06/2003 10:59:34

merci pour cette remarque, c'est corrigé, car en effet il y avait redondance au niveau de ce test.

sinon, je vous remercie pour vos commentaires.

Commentaire de BlackGoddess le 17/06/2003 16:55:40

jolie source !!!
saurais-tu comment faire pour créer une trame (udp) qui est en adresse ip source une adresse externe, et en adresse destination la mienne ?

(par exemple si mon poste a l'ip 192.168.0.1 crée une trame ac comme source 192.168.0.2 et comme destination 192.168.0.1)

parce que la a la reception du a bien toute la trame ip, mais pas a l'emission : tu n'as pas a envoyer l'en-tete ip

Commentaire de roswell117 le 18/06/2003 11:20:21

ce que tu veut, c forger toi-meme l'en-tete IP pour y spécifier les adresses que tu veut. Mais j'ai beau essayé, je n'arrives pas à créer mes en-tetes IP. Voila le principe qu'il faudrait appliquer (forte supposition dûe à des recherches intenses sur le net) :

faire un raw socket (je ne sais pas quel protocole choisir)
parametrer setsockopt() avec l'option IP_HDRINCL (dont le define se trouve dans ws2tcpip.h)
remplir la structure contenant les champs de l'en-tete IP
remplir la structure contenant les champs de l'en-tete UDP
envoyer le tout

voila le principe, et comme dit l'autre, y'a plus qu'à.
Alors je te souhaite bonne chance (je vais quand meme continuer à chercher) mais je comprends pas bien pourquoi tu veut faire ca.

Commentaire de BlackGoddess le 18/06/2003 11:46:01

merci du conseil, je pars tester de suite :) l'interet est de pouvoir repondre a une app udp directement en local

Commentaire de BlackGoddess le 18/06/2003 12:02:31

ta fonction pour calaculer le checksum fonctionne aussi pour calculer celui de l'en-tete ip et udp ?

Commentaire de BlackGoddess le 18/06/2003 13:42:21

mmh ... en envoyant ac send il me dit que le socket est pas connecté, et avec sendto il me dit que c'est une mauvaise adresse.

g testé avec source = mon ip et dest = mon ip
puis avec source = mon ip et dest = broadcast

Commentaire de roswell117 le 18/06/2003 14:06:10

la fonction pour calculer le checksum, qui n'est pas de moi, sert à calculer toute somme de contrôle sur 16 bits, comme celle d'ip et de udp.
La somme de contrôle IP s'effectue seulement sur l'en-tete IP, alors que la somme de contrôle UDP se calcule sur l'en-tete et les données. Une astuce pour ne pas calculer la somme de contrôle UDP est de la mettre à 0 car elle n'est pas obligatoire, contrairement à TCP.

En ce qui concerne la methode pour construire des paquets avec en-tete, je n'ai jamais réussi à faire mes propres paquets mais elle apparait comme étant celle à mettre en oeuvre, meme si je n'ai pas trouvé d'exemple.
Pour faire plus simple, g essayé de faire de paquets ICMP.
Mais j'y arrive toujours pas  :-/

Commentaire de BlackGoddess le 18/06/2003 15:58:30

http://www.insecure.org/sploits/xtacacs.server.dos.html

a l'origine c pour faire une attaque au ping, mais ds l'exemple ils construisent des paquets icmp (je suis pas arrivé a traduire pour de l'udp sous win, la apparement c sous unix)

Commentaire de BlackGoddess le 18/06/2003 21:27:13

apres des recherches sur le net, il semblerais que ce ne soit pas possible avec les raw_sockets de windows... a verifier.

Commentaire de Kikyo le 25/06/2003 10:27:45

Je crois que Windows 95/98/Me bloque l'accès aux entêtes IP, et le seul moyen que j'avais pu voir un jour c t de na pas passer par Winsock et de tout gérer avec le soft en Récupérent les infos de la Cartes Rézo ect ect (enfin c à vérifier, je suis pas sur du system de fonctionnement).

Sinon parait-il que l'accès aux Entêtes IP sous NT/XP est possible.

Commentaire de BlackGoddess le 25/06/2003 16:54:21

en lecture, c sur, mais je n'y parviens en ecriture

Commentaire de BlackGoddess le 25/06/2003 16:55:57

les raw_socket ne sont en effet disponible que sous nt, 2000 et xp, et qu'avec les droits admin parait-il

Commentaire de QzE le 22/08/2003 17:14:07

vraiment, ce code es SUPER! *respect* j'ai cherché quelquechose comme ca depuis des semaines.
mais j'ai un problème: qu'est ce que tu as fait exactement dans le .dev fichier? quand je mets ton code dans mon seul projet ca ne va pas! compiler-erreur:  initializer-string for array of chars is too long
tu peux m'aider?
je m'excuse pour mon francais, mais je suis suisse...

Commentaire de QzE le 22/08/2003 17:14:20

vraiment, ce code es SUPER! *respect* j'ai cherché quelquechose comme ca depuis des semaines.
mais j'ai un problème: qu'est ce que tu as fait exactement dans le .dev fichier? quand je mets ton code dans mon seul projet ca ne va pas! compiler-erreur:  initializer-string for array of chars is too long
tu peux m'aider?
je m'excuse pour mon francais, mais je suis suisse...

Commentaire de cbestern le 03/11/2003 21:45:04

Qze, j'ai eu le même problème que toi, voila les modification que j'ai dut faire:
// Définition des messages d'erreur
char Erreur3[16][60];
char Erreur4[1][16];
char Erreur5[4][40];
char Erreur11[2][40];
char Erreur12[2][24];
//Erreur Erreur3[16];
int InitErr()
{
strcpy(Erreur3[0],"Réseau inaccessible");
strcpy(Erreur3[1],"R202seau inaccessible");
strcpy(Erreur3[2],"Impossible de joindre l'hote de destination");
strcpy(Erreur3[3],"Protocole inaccessible");
strcpy(Erreur3[4],"Port inaccessible");
strcpy(Erreur3[5],"Fragmentation necessaire");
strcpy(Erreur3[6],"Echec de la route source");
strcpy(Erreur3[7],"R202seau de destination inconnu");
strcpy(Erreur3[8],"Machine de destination inconnue");
strcpy(Erreur3[9],"Machine source isol202e");
strcpy(Erreur3[10],"R202seau de destination administrativement interdit");
strcpy(Erreur3[11],"Machine de destination administrativement interdite");
strcpy(Erreur3[12],"R202seau inaccessible pour TOS");
strcpy(Erreur3[13],"Machine inaccessible pout TOS");
strcpy(Erreur3[14],"Communication administrativement interdite par filtrage");
strcpy(Erreur3[15],"Violation de la pr202c202dence de la machine");
strcpy(Erreur3[16],"Coupure de la pr202c202dence en action");
strcpy(Erreur4[0],"D202bit trop 202lev202");
strcpy(Erreur5[0],"Redirig202 pour un r202seau");
strcpy(Erreur5[1],"Redirig202 pour une machine");
strcpy(Erreur5[2],"Redirig202 pour type de service et r202seau");
strcpy(Erreur5[3],"Redirig202 pour type de service et machine");
strcpy(Erreur11[0],"Time-to-live a 0 pendant le transit");
strcpy(Erreur11[1],"Time-to-live a 0 pendant le r202assemblage");
strcpy(Erreur12[0],"Mauvais en-tete IP");
strcpy(Erreur12[1],"Option requise manquante");
}
et juste apres le main() j'ai mis la fonction InitErr();

cela régleras ton problème de :  initializer-string for array of chars is too long

(il y as sans doute une autre métode mais celle ci fonctionne)

par contre j'ai un problème, le programe devant être executer sous NT sans les droits admin, j'ai essayer de remplacé:
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
par
    sock = socket(AF_INET,SOCK_STREAM,0);
mais cela ne fonctionne pas, si quelqun as une idée ce serais superbe.

Sinon le programme en lui même, superbe

Commentaire de BlackGoddess le 03/11/2003 23:59:23

ce programme ne fonctionne bien sur qu'avec les raw sockets, et pas SOCK_STREAM qui définit un protocole plus haut dans le modele iso comme le tcp.

Sous NT, l'utilisation des raw sockets n'est possible QUE avec les droits administrateur ...

Commentaire de Kornferki le 28/03/2004 14:48:00

Coucou,

Alors j ai passe le programme au sniffeur histoire de verifier les packets envoyes. J ai trouve quelques petites erreurs .... ce qui n enleve en rien a la qualite du programme.

Tout d abord, la taille des packets est egale a DATASIZE_ICMP - 8 (taille des headers du bloc ICMP). Cette taille correspond aussi a ce qui est donne par le ping du DOS. En letat 8octets et non 32.

Le TTL que tu indiques dans tes reply est pas le bon non plus. Remonte le TTL dans ta struct de deux lignes vers le haut et tu devrais lire le bon code.

Petites infos complementaires:
Il serait peut etre utile de mettre des caracteres non nuls et differents dans les paquets ICMP. Cela permettra d identifier plus rapidement d eventuels problemes.

Une question: tu saurais comment on pourrait passer a une taille variable de packets ? Le probleme que j ai identifie jusque la, c est que le code en l etat ne permettrait que d envoyer des packets de 500octets (du fait du type char).

Commentaire de juki_webmaster le 25/04/2004 01:43:37

Exelent ! n'utilise pas la lib windows.h donc exelent !
9/10

Commentaire de mIxtEr_ThE_BoSs le 04/05/2004 20:34:31

ché pa dou sa vi1 mé sou windobe xp fam ts lé prog sou dos y souvre é se kite juste apré
èce ke kelk1 peu médé?????????????????????,,

Commentaire de mIxtEr_ThE_BoSs le 05/05/2004 18:28:32

Excusez-moi : il y a pas un code permettant de tester toutes les adresses IP les unes après les autres avec une requête "ping" dans une plage définie?
Exemple : de 121.0.0.0 à 122.0.0.0, ou 0.0.0.0 à 255.255.255.255 (euh... non, faut mieux pas, bonjour la connexion......)

Commentaire de BlackGoddess le 05/05/2004 21:22:22

bin tu te fais une boucle et tu utilises son code ...

Commentaire de GFACTION le 20/05/2004 22:31:58

Error executing cl.exe.
pingueur.exe - 8 error(s), 17 warning(s)

J'ai ouvert le dsw, j'ai compilé et voilà le résulat.

Ca me saoule... Vous savez pourquoi ?

Commentaire de GFACTION le 21/05/2004 15:16:16

non, j'ai rien dit

Commentaire de homer242 le 30/10/2004 22:13:06

y'a pas un problème dans la structure de l'ip ??

la version et la longueur de l'entete ip doit être codé sur un 1 octet et là je crois que c pas le cas....

Commentaire de roswell117 le 31/10/2004 14:28:30

je ne penses pas qu'il y ait un problème car c'est exactement ce qui est codé :

// Structure de l'en-tête IP
typedef struct iphdr {
    unsigned int   h_len:4;
    unsigned int   version:4;

h_len, soit la longueur, est codée sur 4 bits.
version, soit la version, est codée sur 4 bits.
4 bits+ 4 bits= 8 bits soit 1 octet.
Le compte est bon.

Commentaire de durkheim le 19/01/2005 09:51:32

Absolument précis et clair, c'est exactement ce que je cherchais. Bravo!

Commentaire de wizard512 le 09/07/2005 11:46:20

10/10

Commentaire de mellouli_oussama le 27/10/2005 04:10:17

comment ca compile, avec quel compilateur, quels sont les libs requises?

Commentaire de NikatorS le 01/11/2005 23:14:50

Super j'avai besoin d'un example clair de l'utilisation du proto ICMP.
Je vais pouvoir créer un traceur des packets de chez soi jusqu'à une machine X. Un peu comme NeoTrace car mon but est de le reproduire mais en gratuit.

Commentaire de Zeroc00l le 29/08/2006 21:26:14

Le passage sous borland c++ builder 6 se fait sans probleme :

Menu : Fichier -> Nouveau -> Autre
  Choisir "Expert console"
  Clickez sur OK.
  Décocher "Utiliser la VCL" et "utiliser la CLX"
  Cocher "Application console"
  Faites ce que vous voulez avec Multithread :)
  Clickez sur OK

Dans le fichier génére par borland :
  Remplacer la fonction main créée par borland par le contenu du fichier pingueur.c
  Remplacez "sleep(1000);" par "Sleep(1000);" (chez moi le sleep semble bloquer indefiniment)

Menu Executer->Parametres
  Mettez dans le textbox intitulé "Paramètres" : -t www.google.com
  Clickez sur OK

Compilez et appreciez :)

Super source ! j'ai bien tenté de mettre un 10/10 mais le site me dit qu' "Il y a eu une erreur lors de la notation. Veuillez réesayer"

Note : les variables "recept" et "envoi" sont inutilisées, seule chose regrettable a mes yeux. Si tu trouves que c'est saoulant de faire la gestion des erreurs (je te comprends), mets au moins des assertions !

Commentaire de Zeroc00l le 29/08/2006 21:27:02

Ah ça y est j'ai réussit à voter :)

Commentaire de Zeroc00l le 29/08/2006 21:54:15

Encore quelques comentaires :)

Dans la la structure iphdr, le fait de preciser la taille de tous les argument en bit c pas tres joli :/

Ne devrais tu pas "packager" les structures ?

pour gcc : mettre "__attribute((packed))" entre l'accolade fermante de la declaration de la structure et avant le ';' final.

Pour packager sous borland il faut mettre avant les types a packager :
#pragma pack(push, 1)
et apres
#pragma pack(pop)

Commentaire de Zeroc00l le 29/08/2006 21:59:40

Les message d'erreurs me semble bizarres !

Exemple :

le tableau Erreur12 contient deux chaines de 24 caracteres
Or dans "Option requise manquante" il y en a 25 (24 + le zero terminal)
Pour les autres tableaux, c'est pareil ...

Commentaire de Zeroc00l le 29/08/2006 22:24:47

la variable "tpslimite" est pas initialisé a 1000 !!!

Commentaire de Zeroc00l le 29/08/2006 22:35:21

Amelioration :
tv_timeout.tv_sec = tpslimite/1000; Nombre en seconde
tv_timeout.tv_usec = (tpslimite % 1000) * 1000; // et en micro seconde

Commentaire de Zeroc00l le 31/08/2006 00:40:23

Chez moi , cette ligne renvoie toujours NULL :

sn = gethostbyaddr((char *)&in, 4, AF_INET);

WSAGetLastError() renvoie le code WSANO_DATA.
Une idée pourquoi ?

Commentaire de morientes104 le 18/01/2007 11:44:42

ouaou ia du boulot deriere tous sa !
merci au posteur, meme si je vais jsut commencer a etudier le prog car a premiere vu jne pige rien :d
!!

Commentaire de argentino le 21/06/2007 09:53:30

Bonjour,
Je trouve ton programme bien fait.
Mais, j'ai une question: Je voulais savoir si c'est possible à partir de plusieurs @IP, d'envoyer plusieurs ping avec ton programme.
Et si oui comment?

J'ai essayé avec une liste d'adresse predefinie dans un fichier mais ca ne marche bien.

Merci d'avance.

AD

Commentaire de retaks666 le 22/05/2009 14:08:30 8/10

Petite chose quand même, le champ timestamp n'éxiste pas vraiment, il s'agit du champs data, et c'est d'ailleurs dommage qu'on ne puisse pas choisir le nombre d'octets à envoyer, et j'aurai mis le max_packet à plus que 1024. A part ça ça marche bien :)

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales