IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Protocole UDP, adresse MAC distante


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut Protocole UDP, adresse MAC distante
    Bonjour tout le monde, j'ai besoin de votre aide.

    je souhaite developper un outil qui test l'état d'une liaison entre un PC ( OS : WIN2K ) et une machine ( OS : NEXT )
    dans un premier temps je le developpe d'un PC ( LINUX ) pour tester si un autre PC est connecté.
    donc j'ai exploité le protocole ICMP pour envoyer un ECHO_REQUEST mais ca ne peut pas marcher , car la machine ne répond pas aux ping.

    j'arrive à envoyé un message en creant un socket en protocole UDP , et en utilisant un sendto , mais tant que les arguments du sendTo() sont bien configurés , il envoi le message même si de l'autre côté le PC est débranché , donc ca ne me permet pas de tester la connection.
    De plus il m'est impossible d'installer un serveur sur la machine , pour pas bouffer les ressources.
    Je me suis également penché du côté de l'adresse MAC, si j'arrive a récuperer l'adresse MAC du PC distant , ca veut dire qu'il est bien connecté avec mon PC.
    J'ai donc exploité la piste du protocole ARP mais ca ne marche pas non plus.
    Donc, j'ai trouvé un bout de code qui permet de récuperer l'adresse MAC de sa propre machine en utilisant "ioctl"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	if (ioctl(descSock,SIOCGIFHWADDR, &devea) < 0)
    		printf("ERROR\n");
    		else{
    		//Affichage l'adresse MAC
    		printf("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
    			(devea.ifr_hwaddr.sa_data[0]&0xFF),
    			(devea.ifr_hwaddr.sa_data[1]&0xFF),
    			(devea.ifr_hwaddr.sa_data[2]&0xFF),
    			(devea.ifr_hwaddr.sa_data[3]&0xFF),
    			(devea.ifr_hwaddr.sa_data[4]&0xFF),
    			(devea.ifr_hwaddr.sa_data[5]&0xFF));
    		}
    j'ai donc essayé une ultime combine , creer un socket en UDP , faire un bind de se socket à l'ip du PC distant , et ensuite , utiliser le code pour récuperer l'adresse MAC...et ca ne marche pas...or quand je met l'adresse IP "127.0.0.1" ca marche bien même avec le bind..

    Voila je sais pas si j'ai été trés clair , mais il y avait beaucoup d'infos a donner.
    Merci de votre aide ..

    Voici la derniere version:
    1/creation du socket
    2/bind avec le pc distant
    3/recherche de carte réseaux
    4/creation du socket pour utiliser ioctl..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
       #include <sys/ioctl.h> 	// pour ioctl
       #include <sys/socket.h>	// pour socket
       #include <net/if.h> 		// pour ifreq
       #include <string.h> 		// pour strcpy
       #include <unistd.h> 		// pour close
       #include <arpa/inet.h> 	// pour inet_ntoa
       #include <stdio.h> 		// pour printf
       #include <stdlib.h>
       #include <sys/types.h>
       #include <netinet/in.h>
       #include <errno.h> 		// pour errno
     
     
    int main()
    {
     
    // ------- Delarations -------------------------------
     
    	int descSock,sk,addr_in_size;				//numero du socket cree
    	int port;
    	int i = 0;
        struct ifreq devea;
        struct sockaddr_in *sa;			// structure socket
    	struct if_nameindex *nameindex = if_nameindex();
     
     
      	memset(&sa, 0, sizeof(struct sockaddr_in)); // Efface proprement lespace memoire
    	memset(&devea, 0, sizeof(struct ifreq)); // Efface proprement lespace memoire
     
    	addr_in_size = sizeof(struct sockaddr_in);
    	sa = (struct sockaddr_in *)malloc(addr_in_size);
    	memset((char *)sa,(char)0,addr_in_size);
    	//on ouvre un socket 
    	descSock=socket(AF_INET,SOCK_DGRAM,0);
     
    	sa->sin_family = AF_INET;
    	sa->sin_port = htons(1205);			//port libre quelconque
    	sa->sin_addr.s_addr = inet_addr("10.64.114.19"); //adresse a lier
     
    	if (descSock < 0 )
    	{
                   perror("socket ");
                   //On relache le pointeur dynamiquement alloue par if_nameindex
    	       printf("\nDesole, je ne peux pas creer la socket\n"); 
                   if_freenameindex(nameindex);
                return errno;
            }
    	else
    	{
    		printf("Creation du socket -%d- : OK \n",i);
     
    		if (bind(descSock,(struct sockaddr*)sa,addr_in_size)  == -1) 
    		{
    			perror("Erreur  ");
    			close(descSock);
    		}
    		else
    		{
    		//récupération d'un pointeur sur toutes les cartes disponible;
    			if(nameindex == NULL)
    			{
    				perror("if_nameindex ");
    				printf("Aucune carte trouvee \n");
    				return errno;
    			}
     
    			while(nameindex[i].if_name != NULL)//il n'y a plus de cates on sort
    			{
     
    				//Copie du nom dans la structure ifreq 
    				// preparation de l'index pour la prochaine carte
    				strcpy(devea.ifr_name, nameindex[i++].if_name);
    				printf("Reseau : %s\n", devea.ifr_name);  //Affichage de celui-ci
     
    				sk=socket(AF_INET,SOCK_DGRAM,0);
     
    				//Récupération de la MAC adresse
    				printf("\tMAC\t:\t");
    				if (ioctl(sk,SIOCGIFHWADDR, &devea) < 0)
    				{printf("ERROR\n");
    				perror("erreur");
    				}
    				else
    				{
    				//Affichage l'adresse MAC
    				printf("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
    					(devea.ifr_hwaddr.sa_data[0]&0xFF),
    					(devea.ifr_hwaddr.sa_data[1]&0xFF),
    					(devea.ifr_hwaddr.sa_data[2]&0xFF),
    					(devea.ifr_hwaddr.sa_data[3]&0xFF),
    					(devea.ifr_hwaddr.sa_data[4]&0xFF),
    					(devea.ifr_hwaddr.sa_data[5]&0xFF));
    				}
    				//Ferme le socket pour passer au prochain
    				close(sk);
    				printf("Fermeture du socket %d : OK \n\n",i);
    			}
    			if(i == 0) printf("Aucune carte disponible !!!\n");
           			if_freenameindex(nameindex);//libere memoire
    		}
     
    	}
    	close(descSock);
    	return 0;
    }

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ton poste serait certainement plus a son aise sur le forum Developpement Réseaux.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rockt13
    Je me suis également penché du côté de l'adresse MAC, si j'arrive a récuperer l'adresse MAC du PC distant , ca veut dire qu'il est bien connecté avec mon PC.
    Euh, l'adresse MAC, c'est pour des trames Ethernet. Tu manipules des trames Ethernet ?

    Si mes souvenirs sont bon, au premier pont (bridge) venu dans le réseau, l'adresse MAC est régénérée. Si il y a un routeur, pareil... Une adresse MAC, ça fait du point à point, ca va pas loin...

    Pourquoi tu n'utilise pas EtherReal ? On sait tout avec ça...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut EthReal
    Ben en faite , a therme le PC sera directement connecté sur la machine , donc je pense que l'adresse mac sera la bonne .
    C'est pas que je veuille particulièrement utiliser l'adresse MAC, mais comme ces machines la répondent pas au ping, cest le moyen auquel j'ai pensé pour savoir si la machine est bien connecté au PCstation.



    Et pour le logiciel EtherReal je sais pas torp car il en faudrais un sur chaque PC ( comme mon programme en C tu me dira ) mais au final je veut centraliser tout les retour de mes prog C , pour savoir qui est bien connecté a sa machine et qui ne l'est pas , afin de tout afficher sur un site intranet et qui se réactualise tout les X temps.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rockt13
    Et pour le logiciel EtherReal je sais pas torp car il en faudrais un sur chaque PC
    Non. Il suffit d'une machine (Linux, Win32) équipée de ce logiciel sur le réseau. Il est capable d'espionner tous les trafics, de filtrer au niveau protocole, IP, MAC etc.

    Si tu constate une absence de trafic, c'est que la machine n'est pas connectée. Sinon, il y a toujours du NFS ou du NetBios qui traine, des requêtes DNS et autres bruits de fond... (A moins qu'il n'y ait aucun système actif sur les machines).
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par rockt13
    [...] De plus il m'est impossible d'installer un serveur sur la machine [...]
    Et il n'y a pas de service qui tourne déjà dessus ?
    Si non : pourquoi vouloir la connecter et tester si elle l'est ?
    Si oui : il suffit d'essayer de se connecter à ce service et de voir si cela fonctionne.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Points : 45
    Points
    45
    Par défaut
    En faite avec un simple sendto en UDP il est vraiment impossible de savoir si le message est arrivé a destination ?

    Et pour utiliser un bind() de socket faut il obligatoirement qu'il y ait un serveur a l'écoute?
    Si c'est pas obligatoire , y as t'il un moyen de savoir si le bind a bien réussis a ratacher le socket à l'ip voulu ce qui voudrais dire que la machine cible est bien connectée.

Discussions similaires

  1. [WinPcap] Récupéré une adresse MAC distante
    Par vegnagun dans le forum Réseau
    Réponses: 2
    Dernier message: 15/06/2014, 18h21
  2. Adresse MAC d'un PC distant
    Par Nono23 dans le forum Web & réseau
    Réponses: 1
    Dernier message: 14/04/2010, 16h23
  3. Adresse MAC d'un client UDP
    Par laurent_menard dans le forum Web & réseau
    Réponses: 3
    Dernier message: 24/02/2010, 15h42
  4. [Fait]Récupérer l'adresse MAC d'un PC distant
    Par cbleas dans le forum Access
    Réponses: 4
    Dernier message: 06/03/2007, 11h28
  5. récupérer une adresse mac d'un pc distant
    Par Mut dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 03/02/2006, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo