• # OS ?

    Posté par  . Évalué à 2.

    Sous Linux, (je dis peut-être une bêtise ou c'est peut-être assez hardu, mais) tu pourrais peut-être jeter un oeil aux sources de ifconfig ?
  • # Noyau?

    Posté par  (site web personnel) . Évalué à 2.

    linux/net/inet/arp.c ?

    ARP?
    RFC826?
  • # Commentaire supprimé

    Posté par  . Évalué à 4.

    Ce commentaire a été supprimé par l’équipe de modération.

  • # Euh

    Posté par  (site web personnel) . Évalué à 2.

    Je ne suis pas chez moi mais ce soir en rentrant j'peux essayer de te retrouver un bout de code que j'avais en C et qui faisait ce que tu veux (et que j'avais probablement du trouvé sur internet et en moins de 48H !)

    Mais je pointerai du doigt 2 choses :
    _Et si le PC a plusieurs cartes réseau ?
    _Et si le PC n'a pas de carte réseau ?

    Autrement si c'est pour une plateforme linux, pourquoi ne pas récuperer le resultat de /sbin/ifconfig et d'en extraire l'adresse ? en python/perl/bash ca se fait assez simplement non ?
    • [^] # Re: Euh

      Posté par  . Évalué à 1.

      Merci pour ta réponse,

      Pour tout te dire, ce code ce destine à Thinstation, soit une version minimaliste de linux, d'où le besoin d'écrire le programme en c (parce que d'ajouter python ou perl augmenterai la taille de l'OS, et ne serait pas forcement performent sur une toute vieille becane)
      En fait, dans mon cas, l'interface qui m'intéresse est toujours eth0, donc ca simplifie le probleme...

      De chercher l'information dans ifconfig, j'y ai aussi pensé, mais quand je me suis apercu qu'il n'y avait pas de fonctions substring et autres et qu'il fallait passer par la mémoire etc... j'avoue que j'ai pris peur ;) et je me suis aussi dit qu'il devait bien y'avoir un moyen plus direct de faire ca et que c'était un peu bête d'utiliser un programme (ifconfig) qui cherche aussi l'information quelque part... pour ensuite rechercher dans la sortie standard... conceptuellement je trouvais ca un peu dommage, mais si tu pense que c'est le mieux... je vais bien y etre obligé.
  • # ioctl et SIOCGIFFLAGS

    Posté par  . Évalué à 1.

    fais une recherche google avec les 2 mots clés du titre et tu devrais trouver pas mal d'exemples.
    Avec ça, tu récupères les @MAC et les @IP de toutes tes interfaces réseaux, y compris les loopback.
    • [^] # Re: ioctl et SIOCGIFFLAGS

      Posté par  . Évalué à 1.

      Merci de tes conseils pour la recherche google, mais tu penses bien que j'ai essayé ca avant de faire un post non ?
      • [^] # Re: ioctl et SIOCGIFFLAGS

        Posté par  . Évalué à 1.

        Le plus compliqué je pense, c'est d'avoir les bons mots clés pour pouvoir cibler précisément la requête. Je t'ai donné ces mots clé.
        Alors franchement t'as pas du bien chercher alors parce que avec 'ioctl SIOCGIFFLAGS MAC' , ya des exemples pour Linux/Solaris/HP-UX dans la première pages des résultats.
        • [^] # Re: ioctl et SIOCGIFFLAGS

          Posté par  . Évalué à 1.

          Mes plus plattes excuses, j'ai mal lu ton message...
          Lorsque j'ai vu google, je me suis dis ca y est c'est typique, encore quelqu'un qui me renvoie bêtement sur Internet comme si je n'avais jamais touché de navigateur de ma vie...

          Donc encore une fois "excuses-moi", et merci pour ta réponse
  • # Probleme d'overflow ?

    Posté par  . Évalué à 1.

    Voilà le code que j'ai trouvé et modifier (il était en main() avant)
    Le problème c'est que le sprintf provoque un buffer overflow, j'ai des problèmes pour comprendre ces erreurs là.
    D'après ce que j'ai compris, il vaut mieux mettre les valeurs dans un buffer :
    char macaddress[128];
    sprinf(macaddress...);
    mais à ce moment là comment faire pour le return, ca n'a pas l'air de marcher ! il faut utiliser une autre commande ?

    Pour que je comprenne un peu mieux, quelle est la taille maximum d'un char * ?

    Désolé d'assommer tout le monde avec mes questions de newbie, mais mon livre ne couvre pas ces questions de base

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <netinet/in.h>
    #include <net/if.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <sys/socket.h>
    #include <netdb.h>


    char *getmac(char * interface)
    {
    int r;
    struct protoent *proto;
    int sock;
    struct ifreq ifr;
    char * macaddress;

    proto = getprotobyname("tcp");
    sock = socket(PF_INET,SOCK_STREAM,proto->p_proto);
    memset(&ifr,0,sizeof(struct ifreq));
    strcpy(ifr.ifr_name,interface);
    r = ioctl(sock,SIOCGIFHWADDR,&ifr);
    if(r != 0)
    {
    printf("Couldn't get mac address\n");
    exit(1);
    }
    sprintf(macaddress,"%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
    (unsigned char)ifr.ifr_hwaddr.sa_data[0],
    (unsigned char)ifr.ifr_hwaddr.sa_data[1],
    (unsigned char)ifr.ifr_hwaddr.sa_data[2],
    (unsigned char)ifr.ifr_hwaddr.sa_data[3],
    (unsigned char)ifr.ifr_hwaddr.sa_data[4],
    (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
    printf("L'adresse mac est : %s",macaddress);
    return(macaddress);
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.