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 :

Winsock, proxy http et getaddrinfo


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut Winsock, proxy http et getaddrinfo
    Bonjour à tous !

    J'ai quelques questions concernant un proxy http que je fais avec winsock.

    Pour le moment, quand je tappe www.developpez.com dans Firefox, j'arrive à effectuer la communication entre firefox et le proxy et à récupérer la requete http. Pour le moment, je ne fais que l'afficher à l'écran.

    La prochaine étape où je bloque un peu est maintenant le traitement de cette requête.

    Pour le moment, la requete est stockée dans un buffer:
    recv(socketClient,buffer,1515,0);

    1) Y a t-il moyen d'utiliser une fonction prédéfinie pour analyser le buffer et m'en sortir le HOST ou bien faut-il analyser le buffer "à la main" ?

    2) Concernant la connexion au host, j'utilise un exemple du site de msdn:
    erreur = getaddrinfo(ip, port, &aiHints, &aiList);

    le problème est la compréhension de ces champs:
    a) ip est le host que j'ai récupéré

    b) port est un port au hasard ( la requete HTTP précise t-elle un port que je dois récupérer ? )

    c) aiHints et aiList je ne comprend toujours pas ce que c'est... serait-ce mes sockets Client et Serveur ?


    Comment récupérer le sockaddr_in qui est nécessaire pour la fonction connect qui sera utilisée ensuite ?


    Merci à tous !

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    malgré mes connaissances limitées je peux t'apporter quelques réponses:

    *le port pour les requêtes http est toujours 80,
    *la fonction perror(char*) permet d'afficher l'erreur si c'est une erreur de connexion avec le serveur.

    De plus la fonction getaddrinfo est détaillée: http://msdn2.microsoft.com/en-us/library/ms738520.aspx

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut
    ok merci pour le port.

    Pour la doc, je l'avais déjà trouvée comme mentionné plus haut mais j'ai quand même besoin d'aide (cf question 2)

    @+

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    par exemple, lors de la connection à developpez.com (si je suis la doc):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    addrinfo *infos=NULL;
    int err;
     
    err = getaddrinfo("www.developpez.com", "80", NULL, &infos);
    Maintenant tu as toutes les infos dans "infos", qui est une chaine de structures addrinfo.

    si tu veux accéder l'élément suivant de la chaine, il faut appeler infos->ai_next.

    Cependant je n'ai pas compris à quoi te servait cette fonction. Peut être as-tu besoin de la structure infos plus tard?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut
    Bonjour et merci de l'aide.

    Pour reprendre ton exemple, voici ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct addrinfo *infos= NULL;
    int err;
    char bufferHost[65535];
     
    (le bufferHost contient :  www.developpez.com\r\n\0 )
     
    err = getaddrinfo(bufferHost, "80", NULL, &infos);
     
    cout<<"Resultat :"<<infos<<endl;
    cout<<"Contenu :"<<infos->ai_addr<<end;
    et le résultat affiché est :
    0x5a03b8
    0x5a0320


    Si on converti ces nombres de l'hexa en décimal, on ne trouve pas l'adresse IP de developpez.com donc je vois pas ce que j'ai loupé ?

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    lis bien la doc:

    ai_addr

    A pointer to a sockaddr structure. The ai_addr member in each returned addrinfo structure points to a filled-in socket address structure. The length, in bytes, of each returned addrinfo structure is specified in the ai_addrlen member
    ai_addr est lui même un pointeur sur une struct sockaddr.

    Pour récupérer l'IP, je verrais quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inet_ntoa(infos->ai_addr->sa_data)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    infos->ai_addr->sa_data
    Après je peux rien dire vu que je suis pas sous windows. Par contre il y a un exemple dans la doc pour récupérer l'IP d'un serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Declare variables
    hostent* Host;
    char* IP;
     
    // Get the local host information
    Host = gethostbyname("www.developpez.net");
    IP = inet_ntoa (*(struct in_addr *)*Host->h_addr_list);

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 4
    Par défaut
    salut et encore merci !

    cout<< inet_ntoa(infos->ai_addr->sa_data)
    est refusé par le compilateur

    et
    cout<<infos->ai_addr->sa_data
    donne une chaine vide....


    Quand à gethostbyname, ça devient redondant si j'utilise getaddrinfo je pense. Et getaddrinfo est censé retourner direct une variable réutilisable dans le connect donc j'y tient...

    merci
    @+

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    J'ai vraiment regardé sur internet, tout le monde dit d'utiliser getaddrinfo, mais tout le monde utilise gethostbyname...

    voilà la meilleure doc que j'ai trouvé: http://pwet.fr/man/linux/fonctions_b...es/getaddrinfo

    J'abandonne là, je peux rien faire

    Bonne chance..

Discussions similaires

  1. Recherche code source d'un proxy HTTP
    Par david_chardonnet dans le forum Delphi
    Réponses: 1
    Dernier message: 07/10/2006, 10h13
  2. Passer un proxy HTTP - Tunelling
    Par Celelibi dans le forum Réseau
    Réponses: 17
    Dernier message: 05/10/2006, 23h53
  3. HttpInvoke et proxy Http
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 03/10/2006, 15h02
  4. proxy http (s?)+ ftp autorisé, comment utiliser telnet ou ssh?
    Par TabrisLeFol dans le forum Applications
    Réponses: 7
    Dernier message: 12/07/2006, 14h58
  5. Réponses: 3
    Dernier message: 18/04/2006, 22h49

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