• [^] # Re: le Principe...

    Posté par . En réponse au message [Résolut] Recevoir une réponse a mon ping (en C). Évalué à 3.

    Bonjour alpha_one_x86,

    Je suis bien conscient que je vais devoir décoder les différents protocole (ethernet, IPv4, ICMP), au même titre que j'ai du encodé mon packet ethernet (OSI Layer 2 oblige).

    Les sources sur internet ne m'ont pas aidé et la plus part utilise directement l'icmp, pas l'ethernet.

    En fait, si ce que tu souhaites faire est bien un ping (au sens ICMP), je ne pense pas qu'il soit nécessaire (ni même vraiment souhaitable d'ailleurs) de descendre jusqu'à la couche Ethernet.
    Une solution à base de socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) doit fonctionner. (ce qui correspond probablement à ce que tu as trouvé sur le net ?)

    Mais comme tu veux que le paquet ICMP echo sorte par la bonne interface, il suffit juste de faire un bind() de cette socket sur l'adresse IP de l'interface de sortie à utiliser. (Tu peux mettre 0 pour le port dans ce cas)

    C'est d'ailleurs exactement ce que fait ping avec l'option -I chez moi (visible avec strace). Je pense que c'est l'option dont parle Neox.

    Ainsi tu ne "descends" pas en dessous de la couche IP, et donc grâce au modèle OSI :

    • tu ne présupposes plus rien quant au type de réseau de niveau 2 (qui n'a pas à être Ethernet forcément)
    • si c'est de l'Ethernet, tu n'as pas à gérer des adresses MAC, il y aura résolution ARP
    • les 2 machines n'ont plus à être sur le même réseau de niveau 2, si demain tu insères un routeur intermédiaire par exemple

    Ça pourrait déjà bien simplifier les choses, y compris pour le décodage de la réponse.

    Sinon, pour voir les paquets réseau qui sortent et rentrent, rien de tel que wireshark, ou tout simplement tcpdump. Par exemple dans ton cas :

    tcpdump -v -n -e icmp
    

    En espérant ne pas répondre trop à côté de a plaque :)