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 :

[Winsock] Adresse IP internet et non du poste local


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 69
    Points : 68
    Points
    68
    Par défaut [Winsock] Adresse IP internet et non du poste local
    Bonjour,

    Je cherche à envoyer un requête XML au serveur Aspsms.com
    Le serveur me rejète en disant qu'une adresse Locale est interdite en effet il lui envoie l'adresse du PC local, donc il me faudrait l'adresse IP internet (je pense).
    voici mon code pour le socket
    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
     
      SOCKET sock;        
      // Déclaration de l'utilisation de Winsock2
      WSADATA WSAData;
      WSAStartup(MAKEWORD(2,0),&WSAData);
      // Déclaration du socket
      SOCKADDR_IN sin;
      sin.sin_addr.s_addr = inet_addr("194.230.72.111");
      sin.sin_family = AF_INET;
      sin.sin_port = htons(5061);
      sock = socket(AF_INET,SOCK_STREAM,0);
      bind(sock,(SOCKADDR *)&sin,sizeof(sin));
      int val = 0;
      //    
      val = connect(sock,(SOCKADDR *)&sin,sizeof(sin));
        // Fonctions à éxécuter sur le socket
      send(sock,post,strlen(post), 0);
      printf("%s",post);
      send(sock,content_type,strlen(content_type),0);
      printf("%s",content_type);
      send(sock,longueur_content,strlen(longueur_content),0);
      printf("%s",longueur_content);
      send(sock,message,strlen(message),0);
      printf("%s",message);
      recv(sock,retour,1024,0);
      printf("%s",retour);
      recv(sock,retour,1024,0);
      printf("%s",retour);
      closesocket(sock);
      WSACleanup();
    Si quelqu'un a déjà fait cela

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Salut

    Ben au lieu de mettre ton adresse locale tu fais une petite fonction qui te renvoie un zoli char* et qui te donne l'adresse de ta passerelle.

    Une première solution me viens a l'esprit c'est d'appeller un executable qui te l'affiche sur stdout ( redirigé vers un pipe ) pour ensuite lire et regarde l'ip de ta paserelle.

    Cela ne fonctionera que si ta paserelle est sur internet , sinon hihi ca ne marche pas. DONC il faut trouver un moyen de connaitre ton ip public.

    une idée me viens en tête c'est d'emettre une requete http a un serveur qui envoie du html avec ton ip ( regarde y'as plein de site ) et lire le retour.

    c'est lourd, c'est crade.

    J'avoue que je ne me suis jamais posé la question.

    Je regarde ca sèrieusement dès que j'ai le temps.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 69
    Points : 68
    Points
    68
    Par défaut
    Re-bonjour,

    Merci pour l'aide , il existe déjà une fonction qui permet de retourner l'adresse IP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gethostname(char *hostname, size_t size);
    et comme j'ai un client Dyndns , c'est facile.


    cependant mon problème c'est comment spécifié mon adresse IP publique ??

    Merci à tous

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 69
    Points : 68
    Points
    68
    Par défaut
    c'est possible de spécifier l'adresse de source ??


  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2002
    Messages : 69
    Points : 68
    Points
    68
    Par défaut
    Quelqu'un a une idée ???
    je suis perdu.com

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Points : 26
    Points
    26
    Par défaut
    Ben normallement si ton routeur est NAT il encapsule ton message dans un paquet ip internet valide et le serveur pense que c'est son ip !! C'est assez étrange.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par litbos
    c'est possible de spécifier l'adresse de source ??
    Ce n'est pas au programmeur de le faire. C'est le système qui se débrouille (il connait son adresse IP, d'ailleurs, si tu as un routeur, cette adresse sera modifiée au profit de l'adresse publique du routeur...).

    Ce que tu dois faire, c'est récupérer l'adresse distante (du serveur) avec gethostbyname().

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [Winsock] Adresse IP internet et non du poste local
    Citation Envoyé par litbos
    Bonjour,

    Je cherche à envoyer un requête XML au serveur Aspsms.com
    Le serveur me rejète en disant qu'une adresse Locale est interdite en effet il lui envoie l'adresse du PC local, donc il me faudrait l'adresse IP internet (je pense).
    voici mon code pour le socket
    <...>
    Si quelqu'un a déjà fait cela
    Ton code est incomplet.

    Ceci (requete HTTP)
    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
     
    #include <winsock2.h>
    #include <stdio.h>
     
    /* -ed- mise au point... */
    #define EOL "\r\n"
    #define post "GET / HTTP/1.0" EOL EOL
     
    static void http_send (SOCKET sock, char const *request)
    {
       printf ("> '%s'\n", request);
       send (sock, request, (int) strlen (request), 0);
    }
     
    int main (void)
    {
       // Déclaration de l'utilisation de Winsock2
       WSADATA WSAData;
       WSAStartup (MAKEWORD (2, 0), &WSAData);
     
       {
          // Déclaration du socket
          SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
     
          if (sock >= 0)
          {
             printf ("socket %d opened\n", (int) sock);
     
             {
                SOCKADDR_IN sin;
                sin.sin_addr.s_addr = inet_addr ("194.230.72.111");
                sin.sin_family = AF_INET;
                sin.sin_port = htons (80);
     
                bind (sock, (SOCKADDR *) & sin, sizeof (sin));
                int val = connect (sock, (SOCKADDR *) & sin, sizeof (sin));
     
                if (val >= 0)
                {
                   // Fonctions à éxécuter sur le socket
     
                   printf ("connected\n");
     
                   http_send (sock, post);
     
                   {
                      char retour[1024];
                      int n;
     
                      n = recv (sock, retour, sizeof retour - 1, 0);
                      retour[n] = 0;
                      printf ("< '%s'\n", retour);
     
                      n = recv (sock, retour, sizeof retour - 1, 0);
                      retour[n] = 0;
                      printf ("< '%s'\n", retour);
     
                   }
                }
             }
             closesocket (sock);
          }
       }
       WSACleanup ();
     
       return 0;
    }
    donne
    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
     
    socket 96 opened
    connected
    > 'GET / HTTP/1.0
    '
    < 'HTTP/1.1 403 Access Forbidden
    Server: Microsoft-IIS/5.0
    Date: Mon, 07 Nov 2005 09:45:34 GMT
    Content-Type: text/html
    Content-Length: 172
     
    <html><head><title>Directory Listing Denied</title></head>
    <body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow con
    tents to be listed.</body></html>'
    < ''
    Autrement dit, le site n'est pas lisible en HTTP, ce qui est possible. A toi de mettre les bons champs et numéros de ports pour ta requete XML... (ça existe ça ?)

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut Re: [Winsock] Adresse IP internet et non du poste local
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [...]
    #define EOL "\n\r"
    #define post "GET / HTTP/1.0" EOL
    [...]
    La RFC 1945 (puisque tu utilises la version 1.0 du protocole HTTP) définit entre autres :
    Citation Envoyé par RFC1945
    2.2 Basic Rules

    The following rules are used throughout this specification to
    describe basic parsing constructs. The US-ASCII coded character set
    is defined by [17].

    OCTET = <any 8-bit sequence of data>
    CHAR = <any US-ASCII character (octets 0 - 127)>
    UPALPHA = <any US-ASCII uppercase letter "A".."Z">
    LOALPHA = <any US-ASCII lowercase letter "a".."z">
    ALPHA = UPALPHA | LOALPHA
    DIGIT = <any US-ASCII digit "0".."9">
    CTL = <any US-ASCII control character
    (octets 0 - 31) and DEL (127)>
    CR = <US-ASCII CR, carriage return (13)>
    LF = <US-ASCII LF, linefeed (10)>

    SP = <US-ASCII SP, space (32)>
    HT = <US-ASCII HT, horizontal-tab (9)>
    <"> = <US-ASCII double-quote mark (34)>

    HTTP/1.0 defines the octet sequence CR LF as the end-of-line marker
    for all protocol elements except the Entity-Body (see Appendix B for
    tolerant applications). The end-of-line marker within an Entity-Body
    is defined by its associated media type, as described in Section 3.6.

    CRLF = CR LF
    [...]
    4.1 Message Types

    HTTP messages consist of requests from client to server and responses
    from server to client.

    HTTP-message = Simple-Request ; HTTP/0.9 messages
    | Simple-Response
    | Full-Request ; HTTP/1.0 messages
    | Full-Response
    [...]
    5. Request

    A request message from a client to a server includes, within the
    first line of that message, the method to be applied to the resource,
    the identifier of the resource, and the protocol version in use. For
    backwards compatibility with the more limited HTTP/0.9 protocol,
    there are two valid formats for an HTTP request
    :

    Request = Simple-Request | Full-Request

    Simple-Request = "GET" SP Request-URI CRLF

    Full-Request = Request-Line ; Section 5.1
    *( General-Header ; Section 4.3
    | Request-Header ; Section 5.2
    | Entity-Header ) ; Section 7.1
    CRLF
    [ Entity-Body ] ; Section 7.2
    [...]
    Request-Line = Method SP Request-URI SP HTTP-Version CRLF
    En résumé...
    ...la fin de ligne que tu utilises est incorrecte. Il faudrait :...la très grande majorité des serveurs actuels ne supportent plus la version 0.9 de HTTP donc il est plutôt aventureux d'utiliser une requête "simple" puisque c'est un type normalement utilisé pour cette version du protocole. Il faudrait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define post "GET / HTTP/1.0" EOL EOL
    La première séquence CRLF indique la fin de la ligne de requête, la deuxième la fin des entêtes (vides ici).
    Avec des serveurs respectant strictement la norme 1.0 (ou 1.1), n'envoyer qu'une séquence CRLF va conduire le serveur a attendre la deuxième éventuellement précédée des entêtes. Or, si le serveur continue de lire sur sa socket (recv()) et que tu fais de même, arrivera un moment où le serveur en aura marre d'attendre ("timeout") et coupera la connexion sans rien envoyer.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [Winsock] Adresse IP internet et non du poste local
    Citation Envoyé par David.Schris
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [...]
    #define EOL "\n\r"
    #define post "GET / HTTP/1.0" EOL
    [...]
    La RFC 1945 (puisque tu utilises la version 1.0 du protocole HTTP) définit entre autres :
    Citation Envoyé par RFC1945
    2.2 Basic Rules
    Ok, corrigé. Je ne suis absolulment pas spécialiste de HTTP, et ma formation sur le sujet se fait au gré des vents et des besoins...

Discussions similaires

  1. IP adresse Internet et non Reseau
    Par Flow_75 dans le forum C++Builder
    Réponses: 5
    Dernier message: 27/10/2006, 00h29
  2. trouver l'adresse IP internet de mon PC
    Par heider dans le forum Web & réseau
    Réponses: 2
    Dernier message: 21/01/2006, 13h16
  3. Réponses: 5
    Dernier message: 03/12/2005, 12h50
  4. Connaître son adresse IP Internet
    Par ADIDASman dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 28/06/2005, 09h42
  5. [Réseau] Adresse IP internet
    Par Harbaingan dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 25/06/2004, 12h32

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