Recuperation d'adresse IP sous LINUX FEDORA

Signaler
Messages postés
17
Date d'inscription
mercredi 15 mai 2013
Statut
Membre
Dernière intervention
13 juin 2006
-
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006
-
Salut à tous,

J'ai cherché et je n'ai pas trouver un programme ( j'en ai trouvé et
ils ne marchent pas) qui permet de Récuperer et de Modifier l'adresse
IP de la machine.

La machine fonctionne sous LINUX FEDORA et j'utilise pour développer KDevelop.



Merci d'avance de vous reponse et à bientot

18 réponses

Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Salut diablo;

Faudrait peut etre préciser sur quelle interface ....
Sinon voila un petit bout de code qui devrait fonctionner :

struct hostent *host;
struct in_addr **adr;


host = gethostname();
// parcourt des adresses IP
for (adr=(struct in_addr **)host->h_addr_list; *adr; adr++)
{
printf("IP : %s\n", inet_ntoa(**adr));
}

au pire des cas il y a des sites qui en parle, exemple :
http://c.developpez.com/faq/c/?page=reseau
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
Peut être cherches tu la commande ifconfig.

ifconfig (tout court) : donne la configuration actuelle, quelquechose comme ça :

eth0 Link encap:Ethernet HWaddr 00:80:C8:F8:4A:51
inet addr:192.168.99.35 Bcast:192.168.99.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:190312 errors:0 dropped:0 overruns:0 frame:0
TX packets:86955 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:30701229 (29.2 Mb) TX bytes:7878951 (7.5 Mb)
Interrupt:9 Base address:0x5000

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:306 errors:0 dropped:0 overruns:0 frame:0
TX packets:306 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:29504 (28.8 Kb) TX bytes:29504 (28.8 Kb)

ifconfig -a : affiche la configuration de toutes les cartes réseaux
ifconfig eth0 down : desactive l'interface eth0
ifconfig eth0 192.168.99.36 netmask 255.255.255.0 up : réactive eth0 avec la nouvelle ip 192.168.99.36 et le masque de sous réseau 255.255.255.0

sinon plus chirurgical avec :

ip link : http://linux-ip.net/html/tools-ip-link.html#tools-ip-link-set-address
ip adress : http://linux-ip.net/html/tools-ip-address.html
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Ouais aussi, et tu recupère le résultat de ta commande ...
mais normalement c'est pas compliqué à faire
Messages postés
17
Date d'inscription
mercredi 15 mai 2013
Statut
Membre
Dernière intervention
13 juin 2006

Bonjour, petites precisions on developpe sous Qt3 avec kdevelop (en cpp
of course :)). On utilise une interface ethernet. Le but premier serait
d'arriver à recuperer l'@ip locale à partir d'un bout de source.



Axel971: merci de ton conseil, ça peut etre un bon debut de piste, mais
à moins de passer par gethostbyname ça compile pas, et même dans
ce cas là... segfault. Qui plus est, ça pose un petit probleme avec les
pointeurs (erreurs multiples et tellement touffues que ça sert pas à
grand chose de mettre le log de compilation)



AlexN: On a aussi pensé a utiliser directement ifconfig via le source
(enfin on a finit par trouver qqc de plus coherent en passant par ip)

Le tout dans la fonction system.

system("ip addr|grep eth0");

mais... oui il y a un mais :), system retourne l'int du code
d'execution, du coup on peux evidement l'inclure dans un cout, mais on
ne peux pas le stocket dans une chaine de caractere.



Donc si vous aviez l'idée du siecle pour recuperer l'@ip la stocker
dans une chaine. Le tout pour pouvoir l'afficher et par la suite la
modifier (la cgu necessite un autre post pour cette question?)

Merci d'avance pour les futures reponses et merci encore pour celles qui ont été données
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Salut,

J'espère que tu as mis les includes diablo, ceux qui étaient nécessaires à une bonne
compilation, sinon AlexN doit avoir raison il y a surement des topic dispo via ton ami.
Sinon moi je te propose une fonction déjà toute faite pour récuperer (modifier c'est une
autre affaire) l'adresse IP, mais elle est basé sur le même type de code que précédement.

http://c.developpez.com/sources/bcb/?page=internet

ou direct ftp://ftp-developpez.com/c/sources/bcb/codes/localip.zip

Ou encore tu peux récupérer directement par la commande ifconfig en t'y prenant comme ca à mons avis :

ifconfig eth0 | grep inet | cut -d":" -f2 | cut -d" " -f1

et pour modifier on va pas réinventer le monde ifconfig aussi,

si t'as besoins de plus de détails, une url et une :

Linux IP et ...

Voilà peut pas faire plus à mon avis
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
Regardes du coté de chez trolltech qui ont maintenu la librairie Qt je crois.
D'autre part une question :
Quelle ip voudrais tu ? Puisque ta machine possède autant d'ip que d'interface réseau (lo, eth0, eth1, ppp0, etc...) ?
C'est ce que suggère l'un des thread de la liste
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Ethernet il a dit je suppose que c'est l'eth0 ...
Allez bonne programmation
Et vive le C#
Messages postés
17
Date d'inscription
mercredi 15 mai 2013
Statut
Membre
Dernière intervention
13 juin 2006

Salut,



J'ai une erreur quand je fait la compilation. Tout d abord je vais vous
montrer mon source, et apres l'errreur lors de la commande g++ ip.cpp
-o ip.exe :



Source :





<meta http-equiv= "Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

#include <netdb.h>
#include
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include


void PrintIp(char* HostName)
{
struct hostent *host;
struct in_addr **adr;

if((host = gethostbyname(HostName)) != NULL)
{
// parcourt des adresses IP
for (adr =(struct in_addr **)host->h_addr_list; *adr; adr++)
{
printf("IP : %s\n", inet_ntoa(**adr));
}
}
}


Et voici mon erreur ke je n'arrive pas a l enlever :



/usr/lib/gcc/i386-redhat-linux/4.0.0/../../../crt1.o(.text+0x18): In function `_start':

: undefined reference to `main'

collect2: ld a retourné 1 code d'état d'exécution

[Diablo@localhost Desktop]$



Merci de vos réponse et a bientot
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
undefined reference to `main'

tu n'as pas declaré de fonction main qui est le point d'entree obligatoire d'un programme C
Fais l'effort de tabuler tes sources, sinon personne ne fera l'effort de te lire ni de te repondre.
(sauf là parce que ça saute au yeux :o)
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Je suis pas sûr mais je crois pas que l'erreur viennent du code,
à mon avis soit il manque un include, soit lors de la compilation faut
spécifier une librairie, et que ce n'est pas fais.....
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Perso sur un Mandrake moi j'ai manipulé des ip avec les includes suivants:

/*Include nécessaire à la compilation*/

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/param.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <wait.h>

En C tout ca mais ca devrait pas changer grand chose et oui effectivement ton code
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

Sauf que moi je récupérais directement dans le socket, en fait j'avais un serveur,
qui récupérais l'adresse des clients qui se connectait à lui.

Je sais pas si ca t'aidera mais bon :

sockclient= accept(sockserveur,(struct sockaddr *)&sins,&taille);

if(sockclient!=-1)

{

unsigned long addrlong=sins.sin_addr.s_addr;

char addrippointee[16];

/* Calcul de l'adresse ip en char (pointée)) */

sprintf(addrippointee,"%lu.%lu.%lu.%lu",(addrlong & 255),((addrlong>>8) & 255),((addrlong>>16) & 255),((addrlong>>24) & 255));

sprintf(cltactuel.ip,"%s",addrippointee);

cltactuel.sock =sockclient;

nbclt++;

printf("- Un nouveau client est connecté au serveur.\n");

pthread_create(&unclt,NULL,trtclt,(void *)&cltactuel);

}
Messages postés
17
Date d'inscription
mercredi 15 mai 2013
Statut
Membre
Dernière intervention
13 juin 2006

Salut a tous,

Alors j'ai une bonne nouvelle et une mauvaise :

la bonne c'est que j'ai oublier un include et la mauvaise c'est que je n'arrive pas a récuperer mon adresse IP.



Voila le main :



int main(void){


PrintIp("localhost");


return 0;


}



La fonction PinrtIp est ;



void PrintIp(char* HostName){

struct hostent *host;

struct in_addr **adr;

if((host = gethostbyname(HostName)) != NULL){

// parcourt des adresses IP

for (adr=(struct in_addr **)host->h_addr_list; *adr; adr++){

printf("IP : %s\n", inet_ntoa(**adr));

}

}

}



Et cela m'affiche l'adresse de lo c'est a dire 127.0.0.1, mais moi je
voudrai recupere mon adresse 192.168.0.16, comment je doit faire ?



Merci encore une fois de vos réponse et à bientot
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/if.h>
#include <netdb.h>
#include <netinet/in.h>
#include

int main(int argc, char* argv[])
{
int sfd, i;
struct ifreq ifr;
struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;

memset(&ifr, 0, sizeof ifr);

if (0 > (sfd = socket(AF_INET, SOCK_STREAM, 0))) {
perror("socket()");
exit(1);
}

strcpy(ifr.ifr_name, "eth0");
sin->sin_family = AF_INET;

if (0 == ioctl(sfd, SIOCGIFADDR, &ifr)) {
printf("%s: %s\n", ifr.ifr_name, inet_ntoa(sin->sin_addr));
}

return 0;
}
Messages postés
17
Date d'inscription
mercredi 15 mai 2013
Statut
Membre
Dernière intervention
13 juin 2006

Merci AlexN pour ton programme, il marche bien, me donne l'adresse
IP de mon PC (192.168.0.16) mais la fonction exit() ne le reconnait
pas, alors j'etait obliger de l'enlever.



Alors maintenant ke jai mon adresse IP, je veux la changer en lui
passant la nouvelle adresse IP passé en parametre (c'est a dire kil y
aura une kestion, et faudra lui marquer l'adresse).

Alors Voici le début, je rame trop :




if (0 == ioctl(sfd, SIOCGIFADDR, &ifr)){

printf("%s: %s\n", ifr.ifr_name, inet_ntoa(sin->sin_addr));

}



printf("Quelle valeur voulez vous mettre pour l'adresse Ip\n");



return 0;

}



La j'ai mis la question, cela s'affiche mais apres j'ai du mal à la mettre à la place de l'autre adresse.

merci de vos réponses, et à bientot
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
15
Beeeeeeen...
C'était juste pour t'aider un peu. Vais pas te faire tout ton programme ou alors tu me files ta note d'examen ou ton salaire. Enfin on partage quoi... :o)
Maintenant faudrait que tu lises un peu sur la programmation et les réseaux.
Axel971 semblait te conseiller http://www.developpez.com/ mais y'en a sûrement plein d'autres.

Quant à exit(), tu as peut être oublié :
#include
Le petit bout de code a été compilé sous cygwin pas sous linux.
Du moment que ça marche...
Salut

P.S. : cliques sur réponse valide si la solution te convient ça pourra en aider d'autres.
Messages postés
51
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
9 août 2006

AlexN à raison tu devrais te documenter, mais sinon moi je te conseillerai d'utiliser la commande ifconfig,
et un bon exec .... alllez bonne chance