[Linux] Obtenir l'adresse IP Local [C] [Résolu]

ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 22 oct. 2006 à 19:15 - Dernière réponse : ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 27 oct. 2006 à 23:55
3
Merci
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).

Merci cs_aardman 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de cs_aardman
Meilleure réponse
ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 28 oct. 2006 à 00:43
3
Merci
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

Merci ZedMaTrix 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de ZedMaTrix
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 22 oct. 2006 à 19:22
0
Merci
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().
Commenter la réponse de cs_aardman
ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 22 oct. 2006 à 21:15
0
Merci
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
Commenter la réponse de ZedMaTrix
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 22 oct. 2006 à 22:27
0
Merci
Salut,

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

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

ZedMaTriX
Commenter la réponse de ZedMaTrix
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 23 oct. 2006 à 22:05
0
Merci
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.
Commenter la réponse de cs_aardman
ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 27 oct. 2006 à 22:28
0
Merci
HHHooooo !! Merci ! Je vais tester !!!!

ZedMaTriX
Commenter la réponse de ZedMaTrix
ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 27 oct. 2006 à 23:11
0
Merci
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
Commenter la réponse de ZedMaTrix
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 27 oct. 2006 à 23:19
0
Merci
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.
Commenter la réponse de cs_aardman
ZedMaTrix 178 Messages postés vendredi 25 octobre 2002Date d'inscription 14 août 2008 Dernière intervention - 27 oct. 2006 à 23:30
0
Merci
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
Commenter la réponse de ZedMaTrix

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.