[Linux] Obtenir l'adresse IP Local [C]

Résolu
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008 - 22 oct. 2006 à 19:15
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008 - 28 oct. 2006 à 00:43
Hello à tous !!


Voilà, il me semble que j'avais posté, je sais plus ( je retrouve plus le poste )...


Donc là je fais une belle petite classe ( enfin tout les fonctions pour que ca marche ) FTP.


Le but est simple : inclure un fichier ftp.h et ftp.c et pouvoir faire tout ce que l'on veux.


Le soucis, c'est que en mode Actif, c'est donc à moi de dire au serveur
où se connecter. Pour celà, je doit lui donner un port coupé en deux (
Partie 1 : Port/256, Partie 2 : Port%256 ), et juste avant l'adresse ip
de ma carte réseau.


Donc moi mon problème est pour récupéré l'adresse de la carte réseau... Je me suis inspiré de ce site mais je me retrouve avec mon adresse de rebouclage... ( 127.0.0.1 )


Pouvez vous m'aider ?

ZedMaTriX

11 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 oct. 2006 à 23:55
Salut,

D'accord, j'avais compris que le probleme c'etait de recevoir la
connexion. Pour avoir l'ip, je pense que le mieux est de faire un
getsockname() sur le socket que tu utilises pour la connexion de
controle (socket que tu as connecté sur le port 21 du serveur).
3
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
28 oct. 2006 à 00:43
Ok c'est bon !!

Aprés avoir fais le connect(), j'ai fais :

// Calcul la taille de la structure sockaddr_in
lintSze = sizeof (struct sockaddr_in);

getsockname(lintfdSck,(struct sockaddr *)&maPrise, &lintSze);

// Affiche l'adresse IP
printf("Adresse IP : %s\n", inet_ntoa(maPrise.sin_addr));

Parfais ! Merci à toi aardman ! Depuis le temps que je cherchais à faire ca !!

ZedMaTriX
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 oct. 2006 à 19:22
Salut,

En général, quand on fait un serveur on ne se bind pas sur une carte
reseau explicitement, mais sur toutes les interfaces disponibles, en
utilisant l'adresse INADDR_ANY lors du bind().
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
22 oct. 2006 à 21:15
Ce n'est pas un serveur que je veux faire, mais un client ( désolé je l'avais pas précisé ).

Peux tu me donner un exemple de code, ou plus d'informations pour que je puisse récupérer mon adresse IP local s'il te plait?

ZedMaTriX
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
22 oct. 2006 à 22:27
Salut,

J'avais compris, mais dans ton cas ton client joue aussi le role du serveur puisqu'il attend une connexion.
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
23 oct. 2006 à 20:53
Ouais... on pourrais dire ca oui.

Mais alors expique moi mieux ce que tu veux me dire, car je n'ai pas compris

ZedMaTriX
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 oct. 2006 à 22:05
Salut,

Quand tu appeles bind(), il faut utiliser l'adresse ip locale
INADDR_ANY, comme ca ton socket sera bindé sur toutes les interfaces
locales disponibles.
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
27 oct. 2006 à 22:28
HHHooooo !! Merci ! Je vais tester !!!!

ZedMaTriX
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
27 oct. 2006 à 23:11
Heum... Parcontre... j'ai fais ca :

/* Fonction pour retrouver son adresse IP local */
void MonIP ( char rstrMonAdrIP[16] )
{
   
    struct sockaddr_in        maCarte;
   
    int lintSock=0;
   
    // Créer une socket
    lintSock = socket(AF_INET,SOCK_STREAM,0);
   
    /* Remplissage de la structure maPrise */
    maCarte.sin_family = AF_INET;
    maCarte.str_addr.s_addr = htonl(INADDR_ANY);
    maCarte.sin_port = htons(0);
   
    blind(lintSock, (SOCKADDR *)&maCarte, sizeof(maCarte));
}

Mais aprés... je voie pas comment injecter dans le char rstrMonAdrIP l'adresse ip ... ?
( je doit être fatigué )

ZedMaTriX
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 oct. 2006 à 23:19
Salut,

Ce dont je te parle sert à recevoir la connexion du serveur, pas a trouver ton adresse locale.

Une fois que tu as fait ton bind() (et non blind...) sur INADDR_ANY, tu
peux passer ton socket en mode ecoute avec listen() et ensuite, tu peux
appeler accept() pour recevoir la connexion de ton serveur. Au passage,
il faut choisir un autre port que 0 pour se binder.
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
27 oct. 2006 à 23:30
Haaa... Non LOL

Ca c'est bon !! :)

Moi mon soucis, c'est de trouver mon IP en local, pour pouvoir envoyer une commande PORT au serveur.
Aprés le listen etc... pas de soucis ;)

ZedMaTriX
0