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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    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 chevronné
    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
    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 émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    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 chevronné
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 45
    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]));

+ 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