#include #include #include #include #include #include #include #include #define MAXHOSTNAME 32 /* longueur max de son propre nom de machine */ #define PORT_DIST 0x6198 /* numéro de port distant avec lequel on va tenter de dialoguer */ /* on va ici mettre les deux extremites de la liaison sur la meme machine */ struct hostent *infohost(); void adresSock(); /* infohost : recherche et affichage d'informations sur la machine hote */ struct hostent *infohost() { char host[MAXHOSTNAME+1]; /* tableau pour accueillir le nom de machine sur lequel tourne ce programme */ struct hostent *hp; /* resultat de la recherche du nom */ char *adrIPp; struct in_addr adrIP; gethostname(host, MAXHOSTNAME); printf("nom de la machine sur lequel tourne ce programme : %s\n", host); if((hp=gethostbyname(host))==NULL) { fprintf(stderr, "machine hebergeant le programme non identifiee par gethostbyname\n"); exit(1); } printf("longueur d'adresse : %d\n", hp->h_length); adrIP.s_addr=*(int *)hp->h_addr; adrIPp =(char *)inet_ntoa(adrIP); printf("adresse IP de cette machine : %x, soit %s\n", ntohl(adrIP.s_addr), adrIPp); return(hp); } /* adresSock : lecture des adresses dans la socket */ void adresSock(int s){ char *adrp; struct sockaddr_in sa; /* structure adresse socket */ int ssa; /* taille de la structure sa */ /* mise à zero de la structure sa */ ssa = sizeof(sa); memset(&sa, 0, ssa); /* obtention de l'adresse locale */ if(getsockname(s , (struct sockaddr *)&sa , (int *)&ssa )==-1) { perror("erreur de getsockname"); } adrp =(char *)inet_ntoa(sa.sin_addr); /* la sous-structure sa.sin_addr est du type in_addr */ printf("taille de l'adresse locale lue dans la socket : %d\n", ssa); printf("adresse IP locale lue dans la socket: %x, soit %s\n", ntohl(sa.sin_addr.s_addr), adrp); printf("numero de port local lu dans la socket : %x\n", ntohs(sa.sin_port)); /* obtention de l'adresse distante */ memset(&sa, 0, ssa); if(getpeername(s , (struct sockaddr *)&sa , (int *)&ssa )==-1) { perror("erreur de getpeername"); /* on obtient ce message d'erreur si la socket n'est pas connectee */ } adrp =(char *)inet_ntoa(sa.sin_addr); printf("adresse IP distante lue dans la socket: %x, soit %s\n", ntohl(sa.sin_addr.s_addr), adrp); printf("numero de port distant lu dans la socket : %x\n", ntohs(sa.sin_port)); } int main() { int s; /* descripteur du socket */ struct sockaddr_in sa; /* structure adresse socket */ int ssa; /* taille de la structure sa */ struct hostent *hp; /* resultat de la recherche du nom */ /* recherche des infos sur la machine qui heberge le programme */ hp = infohost(); /* allocation d'une socket */ if((s = socket(hp->h_addrtype, SOCK_DGRAM, 0)) < 0) { perror("erreur de la fct socket"); exit(3); } /* lecture des adresses dans la socket */ adresSock(s); /* comme on obtient 0, on voit que la socket n'est pas initialisée */ printf("initialisation de la socket par connect\n"); /* mise à zero de la structure sa */ ssa = sizeof(sa); memset(&sa, 0, ssa); /* copie de l'adresse dans la structure sa */ bcopy((char *)hp->h_addr, (char *)&sa.sin_addr, hp->h_length); sa.sin_family = hp->h_addrtype; /* copie du numero de port dans la structure sa */ sa.sin_port = htons(PORT_DIST); if(connect(s, (struct sockaddr *)&sa, sizeof(sa))<0) { perror("erreur de la fct connect"); } printf("etat de la socket après connect\n"); /* lecture des adresses dans la socket */ adresSock(s); return 0; }