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

C Discussion :

[Sockets]Adresse IP serveur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut [Sockets]Adresse IP serveur
    Bonjour, Alors je ne sais pas trop si je poste au bon endroit.

    J'utilise actuellement les sockets dans un mini jeux et je ne sais pas comment obtenir l'adresse ip du serveur pour l'afficher dans mon code .

    En effet, je suis obligé d'aller chercher l'ip de l'ordinateur manuellement avec windows en tapant ipconfig/all dans l'invité de commande (et en cherchant dans la section câble ethernet par exemple si je suis connecté en local par câble ethernet la ligne indiquant l'ipv4) et ensuite le transmettre l'ip au client.

    Ça marche mais c'est un peu embêtant je voudrais simplement afficher l'ip du serveur a l’écran par un bout de code C. Le serveur n'aura alors plus qu'a lire l'ip et le transmettre au client.

    J'ai essayé plusieurs choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            /* Configuration */
    sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
    sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
    sin.sin_port = htons(PORT);               /* Listage du port */
    Alors j'ai essayé ces bout de code qui m'affiche 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    printf("ip du serveur a transmettre au client %d ",htons(sin.sin_addr.s_addr));
    printf("ip du serveur a transmettre au client %d",sin.sin_addr.s_addr);
    printf("ip du serveur a transmettre au client %d", htonl(INADDR_ANY));
    Merci de votre aide, je débute tout juste avec le réseau

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 869
    Par défaut
    A partir de l'interface réseau, tu ne pourras obtenir que les adresses locales (127.0.0.1 et 192...). Si ton client est sur le même réseau ou pc que toi ça le fera mais sinon il va falloir trouver une autre solution.

    Pour trouver ton adresse globale (celle que les clients qui n'appartiennent pas à ton réseau voient), je me connectais à un site qui me retournait mon ip. Un peu de parsing et c'était réglé.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Salut,

    Tu peux reprendre du code que j'ai fait et mis sur Github : https://github.com/Bktero/DummyCodes...tenir_son_ip.c Bien sûr, cela donne ton adresse sur le réseau local.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut
    Merci de vos réponses

    J'a essayé ton code Bktero, mais je n'arrive pas a l'adapter au mien il ne reconnait pas cette ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    addr = * ( (struct in_addr*)localhost->h_addr_list[0] );
    voici mon code Serveur j'ai essayé d'integrer de difféerentes manière ton bout de code celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        struct in_addr addr;
        struct hostent *localhost;
        int ret = -1;
        char localname[1000] = {0};
     
        // Recuperer le nom du PC local
        ret = gethostname( &(localname[0]), 999);
     
        // Recuperer une structure decrivant un hote a partir de son nom
        localhost = gethostbyname( &(localname[0]) );
     
        // Extraire l'adresse (on suppose qu'elle est de type IPv4)
        addr = * ( (struct in_addr*)localhost->h_addr_list[0] );
    Mais ça ne marche pas chez moi, si tu peux m'expliquer un peu plus ou alors d'ou viens mon erreur je ne comprend pas ton hosten par exemple .

    Mon code je l 'ai decomposé en plusieurs fonction charger et fermer les sockets plus le main

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    #if defined (WIN32)
        #include <winsock2.h>
        typedef int socklen_t;
    #else // SI OS X OU LINUX
        #include <sys/types.h>
        #include <sys/socket.h>
        #include <unistd.h>
        #include <netinet/in.h>
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #define closesocket(s) close(s)
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
    #endif
     
    #if defined (linux)
        #include <arpa/inet.h>
    #else// OS X
        #include <pthread.h>
        #include <string.h>
        #include <fcntl.h>
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define PORT 1234
     
     
    void host(SOCKET *sock,SOCKET *csock)
    {
    #if defined (WIN32)
        WSADATA WSAData;
        int erreur = WSAStartup(MAKEWORD(2,2), &WSAData);// initialise bibliotheque WinSock.
        Puis à la fin, placez celui-ci :
    #else
        int erreur = 0;
    #endif
     
        /* Socket et contexte d'adressage du serveur */
        SOCKADDR_IN sin;//contexte d'adressage
        socklen_t recsize = sizeof(sin);
        /********************************************/
     
     
        /* Socket et contexte d'adressage du client */
        SOCKADDR_IN csin;
        socklen_t crecsize = sizeof(csin);
        /********************************************/
     
     
     
        if(!erreur)//Pour windows
        {
            /* Création d'une socket */
            *sock=socket(AF_INET, SOCK_STREAM, 0);
            if(*sock== INVALID_SOCKET)
                perror("socket");
     
            printf("La socket %d est maintenant ouverte en mode TCP/IP\n", *sock);
     
            /* Configuration */
            sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
            sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
            sin.sin_port = htons(PORT);               /* Listage du port */
     
            if(bind(*sock, (SOCKADDR*)&sin, recsize)== SOCKET_ERROR)
                perror("bind");
     
            /*********************************************************/
     
     
            /* Démarrage du listage (mode server) */
     
            if(listen(*sock, 5)!=SOCKET_ERROR); //Si l ecoute est valide
            printf("Listage du port %d...\n", PORT);
     
            printf("Un client se connecte avec la socket %d de :\n", htonl(INADDR_ANY));
     
     
            /* Attente pendant laquelle le client se connecte */
            printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
            *csock = accept(*sock, (SOCKADDR*)&csin, &crecsize);
            printf("Un client se connecte avec la socket %d de :%d\n", *csock, htons(csin.sin_port));
     
     
        }
    }
     
    void closeSock(SOCKET *sock,SOCKET *csock)
    {
     
     
        /* Fermeture de la socket client et de la socket serveur */
        printf("Fermeture de la socket client\n");
        closesocket(*csock);
        printf("Fermeture de la socket serveur\n");
        closesocket(*sock);
        printf("Fermeture du serveur terminée\n");
     
     
     
    #if defined (WIN32)
        WSACleanup();
    #endif
    }
     
     
    int main()
    {
        int i=0;
        SOCKET sock = 0,csock = 0;
        host(&sock,&csock);
        struct in_addr addr;
        struct hostent *localhost;
        int ret = -1;
        char localname[1000] = {0};
     
        // Recuperer le nom du PC local
        ret = gethostname( &(localname[0]), 999);
     
        // Recuperer une structure decrivant un hote a partir de son nom
        localhost = gethostbyname( &(localname[0]) );
     
        // Extraire l'adresse (on suppose qu'elle est de type IPv4)
        addr = * ( (struct in_addr*)localhost->h_addr_list[0] );
     
        char msg[50]="" ;
        printf ("\n le serveur va lire \n");
     
        for (i=0; i<1000; i++) {
            send(csock, "123456789", 50, 0);
     
        }
        for (i=0; i<1000; i++) {
            recv (csock, msg, 50,0);
            printf ("\n le message envoye par le client est : %s ", msg);
        }
     
        closeSock(&sock, &csock);
        return 0;
    }

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Que signifie "cette ligne n'est pas reconnue" ? Quelle erreur as-tu ?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Par défaut
    Bonjour merci de ta réponse

    alors j'ai un warning a la ligne 125
    Implicit declaration of function gethostbyname is invalid in C99

    et l'erreur a la ligne 128
    Incomplete definition of type 'struct hostent'.

    Je suis sous Xcode
    Pourtant d'après la documentation apple je ne vois pas d'erreur.
    http://developer.apple.com/library/i...tbyname.3.html

    Peut-être que la dernière version d'Xcode ceci n'est plus valable.

    Par contre si je copie la struct hosten au dessus de mon programme l'erreur est enlevée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     struct  hostent {
           char    *h_name;        /* official name of host */
           char    **h_aliases;    /* alias list */
           int     h_addrtype;     /* host address type */
           int     h_length;       /* length of address */
           char    **h_addr_list;  /* list of addresses from name server */
         };
    Mais il n'aime pas non plus cette ligne : le inet_ntoa plus précisément.
    printf("IP = %s\n", inet_ntoa( addr ) );

    Cependant dans le rapport programme j'ai pus voir que dans la variable addr il y'a un chiffre commençant par 160 de la taille d'un ip mais sans les point j'ai l'impression que les fonctions ne sont plus valide comme inet_ntoa de même pour gethostbyname dans la variable du nom j'ai Mackbookpro.local ça a l'air de fonctionner mais pas complètement car ça plante.
    Pourtant ton code marche parfaitement sous mon windows, il fait parfaitement ce que je veux

    Je pourrais prendre une capture d'ecran mais je ne sais pas comment le mettre dans la discussion pour vous montrer.

    EDIT:
    Alors le gethostbyname n'est pus declaré invalid y'avais une biblootheque a inclure.
    Celle-ci
    #include <netdb.h>
    Mon problème vient toujours de inet_ntoa( addr ) il est lui aussi a son tour déclaré invalid in C99 il doit y avoir une libraire aussi je cherche ...

    L'IP qu'il me donne n'est pas bonne IP = 1999307216
    et il me demande de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("IP = %d\n", inet_ntoa( addr ) );
    %d sinon il plante et n'affiche rien

    REEDIT:
    Alors C'est bon cela marche il me manquait les deux libraires suivantes
    #include <netdb.h>
    #include <arpa/inet.h>

    mais l'IP qui m'est donnée par le programme ne correspond pas.Je m'explique:
    Je me suis connecté en réseau local avec un câble ethernet avec un autre ordinateur mais si je suis dans le même temps connecté à internet, il me donne l'IP internet(de la carte wi-fi) alors que je ne suis en réseau avec personne je suis tout seul(enfin je crois) donc je ne vois pas pourquoi il me donne l'IP d'internet mais bon la je pense que c'est difficile de régler ceci ? L'utilisateur devrai saisir son mode de connexion wi-fi ethernet pour que ça marche je ne sais pas si c'est possible.
    Cependant lorsque je déconnecte le wi-fi il me donne bien l'ip local avec le câble ethernet.

    Merci.

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

Discussions similaires

  1. [C++] Probleme de connexion socket client à mon serveur smtp
    Par matthieu5978 dans le forum Développement
    Réponses: 2
    Dernier message: 04/12/2005, 08h19
  2. [socket] connexion à un serveur irc
    Par soad dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 19/11/2004, 02h59
  3. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 22h32
  4. [Routeur/Socket] Connection Client/Serveur
    Par Clorish dans le forum Développement
    Réponses: 3
    Dernier message: 17/12/2003, 13h45
  5. [SERVLET] trouver adresse du serveur
    Par Super Castor dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/10/2003, 16h20

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