Re: Application reseaux

Page principale

Répondre à ce message
Auteur: Edgar Bonet Orozco
Date:  
À: guilde
Sujet: Re: Application reseaux
Le mardi 08 juin, à 19h05 (+0200), yannick excoffon a écrit :
> Je travaille actuellement sur un programme qui gere des transferts de
> donnees entre machines distantes (Langage C, OS Linux) et j'ai deux
> problemes qui pour l'instant sont resolu 'salement'.
>
>     1) Comment recuperer l'adresse internet de la machine locale d'ou
> est lancee l'application en C (nom ou adresse IP peu importe). Sans
> aller parcourir les fichiers /etc/resolv.conf et autres (solution
> actuelle).


La question n'est pas simple car, dans le cas général, ta machine peut
avoir plusieurs adresse IP (en fait il y probablement au moins le LAN et
localhost). Quand tu lances un serveur, tu lui demandes en général
d'écouter sur _toutes_ les adresses IP en faisant quelque chose comme :

    int s, t, addr_size = sizeof(struct sockaddr);
    struct sockaddr_in my_addr, his_addr, recv_addr;


    s = socket(AF_INET, SOCK_STREAM, 0);
    my_addr.sin_family = AF_INET; /* IP */
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Toutes les adresses */
    my_addr.sin_port = htons(no_port);
    bind(s, (struct sockaddr *) &my_addr, addr_size);


C'est uniquement quand tu reçois la connexion d'un client que tu peux
savoir quelle est, parmi tes adresses, celle sur laquelle il s'est
connecté :

    listen(s, backlog);
    t = accept(s, (struct sockaddr *) &his_addr, &addr_size);
    getsockname(t, &recv_addr, &addr_size);
    printf("Le client m'a contacté sur %s:%d\n",
        inet_ntoa(recv_addr.sin_addr), ntohs(recv_addr.sin_port));


>     2) Comment passer un Login et un password lorsqu'on programme avec
> des sockets et a quel moment (socket, bind, connect ...). Sans une
> batterie de popen est-ce possible.


La question n'est pas très claire. Qu'est-ce que tu comptes faire avec
les popen ?

Si tu veux que ton programme fasse de l'authentification (demande un
login et un mot de passe pour laisser le client se connecter pour le
compte d'un utilisateur), la façon propre de le faire est de passer par
PAM. PAM est une bibliothèque qui s'occupe de l'autherntification et qui
permet d'en centraliser la configuration. La documentation de PAM se
trouve probablement dans /usr/local/doc (je la'i en HTML chez moi).

Si tu utilises une liste d'utilisateurs différente de celle du système
(/etc/passwd), tu ne passeras probablement pas par PAM. Regarde le
manuel de Apache pour voir comment il fait.

C'était bien ça la question ? Précise un peu plus.

-- 
Edgar Bonet Orozco
Lab. Louis Néel --  CNRS             Tel :    +33 476-88-90-89
BP 166                               Fax :    +33 476-88-11-91
38042 Grenoble cedex 9               e-mail : bonet@???