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;
}