IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Obtenir l'adresse IP du client provenant d'une socket


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut Obtenir l'adresse IP du client provenant d'une socket
    Bonjour à tous,

    J'ai fait 2 programmes : 1 serveur et 1 client qui communique par socket.

    L'application marche bien et je voudrais obtenir l'adresse IP du client qui répond au serveur.

    Voici le code de la partie serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    /***********************************SERVEUR TCP**********************************/
    #include<stdio.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<unistd.h>
    #include<stdlib.h>
     
    #define PORTS 2058
     
    main() 
    {
    int namelen, sock, nsock;
    char buf[20];
    struct sockaddr_in adr_s, adr_c;
    int lg, n, pid;
    int bindReturn;
    int listenReturn;
    int acceptReturn;
     
    /* Cr�ation socket */
    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     
    printf("Voici le Socket : %d\n", sock);
     
    /* Attachementsocket */
     
    /**************************************************************************************/
    /*  Server address	*/
    /**************************************************************************************/
    /*construit_adresse_locale (&adr_c, 0); */
     
    adr_s.sin_family = htons(AF_INET); 
    adr_s.sin_addr.s_addr = htonl(INADDR_ANY); 
    adr_s.sin_port = htons(PORTS); 
     
    bindReturn = bind(sock, (struct sockaddr*)&adr_s, sizeof(adr_s));
     
    printf("Voici le bind : %d\n", bindReturn);
     
    listenReturn = listen(sock,5);
     
    printf("Voici le listen : %d\n", listenReturn);
     
    /* Boucle d'acceptation d'une connexion */
     
    while(1==1) 
     
    { 
    	/* Attente de question sur la socket */
     
    	lg= sizeof(adr_c);
    	nsock= accept (sock, (struct sockaddr*)&adr_c, &lg);
     
    	pid= fork();	
     
    	if (pid== 0) 
     
    	{
    		close (sock);
    		read (nsock, buf, 20);
     
    		printf("%s\n",buf); 
     
    	             /*Ici on obtient un chiffres qui ne ressemble pas à une adresse IP*/
    		printf("%d\n", inet_ntoa((struct sockaddr*)&adr_c)); 
     
    		close (nsock);
     
    		exit(0);
    	}
    }
    }
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d\n", inet_ntoa((struct sockaddr*)&adr_c));
    je n'arrive pas à obtenir l'adresse IP du client.

    Auriez-vous une idée ?

    Merci beaucoup pour vos réponses.

    Laurent.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Bonjour,

    Essaie comme cela...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s\n", inet_ntoa (adr_c.sin_addr));
    Attention, inet_ntoa retourne un char* et non un entier...

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("%s\n", inet_ntoa(adr_c.sin_addr));
    edit: arf trop lent

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Merci à vous 2 pour votre réponse.

    J'ai testé et çà n'affiche rien.

    Et chose étrange quand j'exécute ce code, rien ne s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    if (pid== 0) 
     
    	{
    		close (sock);
    		read (nsock, buf, 20);
     
                  	printf("essai !!");
     
                             printf("%s\n",inet_ntoa(adr_c.sin_addr)); 		
     
                   	printf("%s\n",buf); 
     
    		close (nsock);
     
    		exit(0);
    	}

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par laurent12345 Voir le message
    Et chose étrange quand j'exécute ce code, rien ne s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (pid== 0) 
    	{
    		close (sock);
    		read (nsock, buf, 20);
    		// [..]
    	}
    Le socket que tu fermes, ce ne serait pas le socket serveur par hasard ? A partir du moment ou un des deux sockets (serveur ou client) est fermé, la connexion est interrompue...
    De plus le read effectué par le socket client, qu'est-il censé lire ? Je n'ai pas vu dans ton code le moindre octet envoyé par le serveur...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Pourtant le code suivant affiche bien le retour du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (pid== 0) 
     
    	{
    		close (sock);
    		read (nsock, buf, 20);
     
    		printf("%s\n",buf); 
     
    		close (nsock);
     
    		exit(0);
    	}
    En effet, il y a un programme client qui communique avec le server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    /******************/
    /* Client TCP */
    /******************/
    #include<errno.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<unistd.h>
     
    #define PORTS 2058
     
    main()
    {
     
    struct hostent*h;
    struct sockaddr_in adr_s,adr_c;
    char buf[20];
    int sock;
    int connectReturn;
    int writeReturn;
    /* cr�ationsocket */
     
    sock= socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
     
    printf("Voici le Socket : %d\n", sock);
     
    /* Attachementsocket */
     
    /**************************************************************************************/
    /*  Client address	*/
    /**************************************************************************************/
     
    h=gethostbyname("localhost");
     
    if (h == NULL)
    printf("gethostbyname == NULL");
     
    /**************************************************************************************/
    /*  Server address	*/
    /**************************************************************************************/
    bzero((char *) &adr_s, sizeof(adr_s)); 
     
    adr_s.sin_family = AF_INET; 
    adr_s.sin_addr.s_addr = *((unsigned long*)h->h_addr); 
    adr_s.sin_port = htons(PORTS); 
     
    connectReturn = connect (sock,(struct sockaddr*)&adr_s, sizeof(adr_s));
     
    perror("Erreur connect : ");
     
    printf("Erreur connect : %d\n", errno);
     
    printf("Voici le connect : %d\n", connectReturn);
     
    write(sock, "20100204, serveur!! ", 20);
     
    close (sock);
     
    }
    Laurent.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    J'ai trouvé la façon d'obtenir l'adresse IP de la machine locale :

    Il faut passer par "gethostname" pauis "gethostbyname".

    Je l'ai fait tourner avec un petit exemple, mais quand j'ai voulu l'intégrer dans mon application cela plante :

    "cast to pointer from integer of different size"

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    /******************/
    /* Client TCP */
    /******************/
    #include<errno.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include<unistd.h>
     
    #define PORTS 2058
     
    #define MAXHOSTNAMELEN 64
     
    main()
    {
     
    	struct hostent *hostServer;
     
    	struct hostent *hostLocal;
     
    	struct sockaddr_in adr_s,adr_c;
    	char buf[20];
    	int sock;
    	int connectReturn;
    	int writeReturn;
     
    	struct in_addr **localAddrList;
     
    	char localHostname[MAXHOSTNAMELEN];
     
    	char localIpAddress[MAXHOSTNAMELEN];
     
    	//Get local host name
    	gethostname(localHostname, MAXHOSTNAMELEN);
     
    	//Get the local host structure
     
    	//diep
    	if ((hostLocal = gethostbyname(localHostname)) == NULL) {  // get the host info
     
    		herror("gethostbyname");
    	}
     
    	localAddrList = (struct in_addr **)hostLocal->h_addr_list;    
     
    	/***************************************************************************************************/
    	// here is the problem : "cast to pointer from integer of different size"
    	/***************************************************************************************************/
    	localIpAddress = strcpy((char *)localIpAddress, (char *)inet_ntoa(*localAddrList[0]));
     
    	printf("here is the IP : %s", localIpAddress);
     
    	sock= socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
     
    	printf("Voici le Socket : %d\n", sock);
     
    	hostServer=gethostbyname("localhost");
    	//h=gethostbyname("localhost");
     
    	if (hostServer == NULL)
    		printf("gethostbyname == NULL");
     
    	/**************************************************************************************/
    	/*  Server address	*/
    	/**************************************************************************************/
    	bzero((char *) &adr_s, sizeof(adr_s)); 
     
    	adr_s.sin_family = AF_INET; 
    	adr_s.sin_addr.s_addr = *((unsigned long*)hostServer->h_addr); 
    	adr_s.sin_port = htons(PORTS); 
     
    	connectReturn = connect (sock,(struct sockaddr*)&adr_s, sizeof(adr_s));
     
    	perror("Erreur connect : ");
     
    	printf("Erreur connect : %d\n", errno);
    	printf("Voici le connect : %d\n", connectReturn);
     
    	write(sock, "20100204, serveur!! ", 20);
     
    	printf("Voici le write : %d\n", writeReturn);
     
    	close (sock);
     
    }
    à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    localIpAddress = strcpy((char *)localIpAddress, (char *)inet_ntoa(*localAddrList[0]));

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    En fait, le mieux pour moi serait d'obtenir l'adresse IP du client à partir de la structure sockaddr_in que je passe en paramètre de la fonction accept dans le code du serveur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    struct sockaddr_in adr_c;
    nsock = accept(sock, (struct sockaddr*)&adr_c, &lg);
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct sockaddr_in adr_c;
     
    strcpy((char *)buf1, (char *)inet_ntoa(*((unsigned long*)adr_c.sin_addr)));
    mais j'ai l'erreur "cast to pointer from integer of different size".

    Pourriez vous m'aider ?

    Merci.

    Laurent.

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Tu travaille sur quelle plateforme ?

  10. #10
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    le message dit que tu force un pointeur en un entier
    apparement la fonction retourne un entier et non un pointeur meme si c bizarre

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par khelifa19 Voir le message
    le message dit que tu force un pointeur en un entier
    apparement la fonction retourne un entier et non un pointeur meme si c bizarre
    Exact... Surtout qu'on a été au moins deux à déjà te dire que cette fonction s'utilise de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n", inet_ntoa(adr_c.sin_addr));

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Désolé de répondre si tard, mais je n'avais pas de notifications sur mon email.

    En fait le problème a été résolu en ajoutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <arpa/inet.h>
    au projet car sinon le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inet_ntoa(adr_c.sin_addr)
    n'est pas reconnu.

    Merci pour vos réponses.

    Laurent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher le texte provenant d'une socket
    Par Erolgamer dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2010, 23h34
  2. Obtenir l'adresse mac de sa carte reseau
    Par kivoch dans le forum C++Builder
    Réponses: 4
    Dernier message: 19/11/2009, 18h30
  3. Réponses: 2
    Dernier message: 24/06/2008, 12h40
  4. Obtenir l'adresse MAC réelle
    Par gpetto dans le forum Réseau
    Réponses: 16
    Dernier message: 03/11/2003, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo