Forum Programmation.c Sock HTTP sur IceWarp version : 4.1

Posté par  .
Étiquettes : aucune
0
20
oct.
2006
Dans le cours d’un projet de « client » pour un Protocol http, je développe un code en C.
J’essaye d’établir une connexion sur un serveur IceWarp dans sa version : 4.1 de manière a pouvoir visionner le contenu de la page.
J’arrive qu’à obtenir l’entête du serveur :
========================entête========================
Server: IceWarp/4.1
Date: Thu, 19 Oct 2006 19:36:50 -0600
Content-Type: application/octet-stream
Content-Length: 689
Last-Modified: Fri, 19 Aug 2005 15:37:10 -0600

981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
========================entête========================
Malgré de nombreuse tentative a détourné ce problème (retour de chariot, etc.) toujours le même problème.
L’adresse sur la quel j’aimerais aboutir est : http://mail.networksolutionscanada.ca:32000/mail/calendar_fr(...)


Morceau du code défectueux :
========================code========================
if(connect_with_time(sock,(struct sockaddr *)&addr, sizeof(struct sockaddr),&tv) == -1)
{
printf("couldn't connect to server\n");
}
else
{
snprintf(request,sizeof(request),"GET /mail/calendar_friends.html HTTP/1.0\n\n\r\n",target,port);
fprintf(stdout,"[+] sending request to %s\t",target);
if(send(sock,request,strlen(request),0)==-1)
fprintf(stdout,"-send() error\n");
else {
fprintf(stdout,"[+] %s => reading banner...",target);
i=recv(sock,empf_buffer,sizeof(empf_buffer),0);
empf_buffer[i]='\0';
if(strstr(empf_buffer,"Welcome")!=NULL )
{
fprintf(stdout,"success!\n");
fprintf(logfile,"%s\n",empf_buffer);
}
else
{
fprintf(stdout,"Not found");
}
}
}
========================code========================
Avez-vous éventuellement une idée afin de résoudre ce problème ? Qui je m’en doute est d’un niveau assez débutant dont je fais part. Merci a vous.

MR MC DEFFiCE CREWKAiTE
  • # reminder

    Posté par  . Évalué à 2.

    reminder: (outre le fait que le code est plutôt ... hum ... exotique,) ne pas oublier de dire quel est le problème !
  • # Sock HTTP sur IceWarp version : 4.1 (Eclaircis du probleme/desir)

    Posté par  . Évalué à 1.

    Le problème : Acquérir le code source de la page du serveur distant, le code « html » et non pas le header du serveur. Exemple avec TELNET :

    ==========================EXEMPLE==========================
    frenchnet@ipnode:~$ telnet mail.networksolutionscanada.ca 32000 #ENTER
    Trying 38.112.124.163...
    Connected to mail.networksolutionscanada.ca.
    Escape character is '^]'.
    GET /mail/calendar_friends.html HTTP/1.0 #INSETION DE “GET /mail/calendar_friends.html HTTP/1.0” ET 2X ENTER

    HTTP/1.0 200 OK #DEBUT ENTETE DU SERVEUR (ce que j’obtiens déjà avec mon code)
    Server: IceWarp/4.1
    Date: Fri, 20 Oct 2006 02:07:33 -0600
    Content-type: text/html
    Expires: Fri, 20 Oct 2006 08:07:33 GMT
    Pragma: no-cache #FIN ENTETE DU SERVEUR (ce que j’obtiens déjà avec mon code)


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> #DEBUT DU CODE HTML (CE QUE J&#8217;AIMERAIS AVOIR)
    <HTML>
    <HEAD>
    <TITLE>Web Mail</TITLE>
    <meta http-equiv="content-type" content="text/html; charset=us-ascii">
    <LINK REL="StyleSheet" HREF="skins/Outlook2003/login.css" type="text/css">

    <script language="JavaScript" src="inc/cipher/sha1.js"></script>

    </HEAD>
    &#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;#DECOUPAGE DE LA LONGUEUR
    </BODY>
    <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
    if (top.length != self.length)
    {
    var isskin;
    isskin = parent.document.getElementById("foldermenu");
    if(isskin) top.location.href = self.location.href;
    }
    document.login.username.focus();
    </SCRIPT>
    </HTML>Connection closed by foreign host. #FIN DU CODE HTML (CE QUE J&#8217;AIMERAIS AVOIR)
    frenchnet@ipnode:~$
    ==========================EXEMPLE==========================
    J&#8217;aimerais arriver à recevoir grâce a mon sock donc entre DEBUT/FIN DU CODE HTML parce que je ne reçois que l&#8217;ente du serveur !? Ceci est mon problème majeur dans ce code !!

    Pour le code exotique, je suis désolé j&#8217;ai fait tellement de teste de toute les manières que j&#8217;approuve le faite dire qu&#8217;il est rendu « exotique »

    if(strstr(empf_buffer,"Welcome")!=NULL ) permet de réagir si il trouve le mot Welcome(ici) dans empf_buffer.
    empf_buffer Contient les données reçu du serveur après qu&#8217;on lui ait envoyer « snprintf(request,sizeof(request),"GET /mail/calendar_friends.html HTTP/1.0\n\n\r\n",target,port); »

    Voilà pour le petit résumé.
    Donc mon problème :
    1) Avoir le html de l&#8217;url requeté au serveur.
    2) Quand l&#8217;adresse distante retourne aucun header, entête le code reste bloquer.
    3) IceWarp réagissant seulement dans sa version 4.1 de cette manière.

    Solution amicalement souhaité :
    1) Avoir un code ce connectant au serveur distant, récupérant le header (entête) et le corps (contenu html).
    2) Vérifié dans le header (entête) la présence de la ligne : « Server: IceWarp/4.1 »
    3) Une fois la solution 1,2 réaliser il ne reste plus que a vérifier si le corps (contenu html) existe le mot « Welcome »

    Voici donc ce que j&#8217;aimerais faire, et le problème associé.

    • [^] # Re: Sock HTTP sur IceWarp version : 4.1 (Eclaircis du probleme/desir)

      Posté par  (site web personnel) . Évalué à 1.

      Le protocole HTTP est très complexe, tu risques de faire face à beaucoup de problèmes...
      La longueur du corps est spécifiée par l'entête Content-Length... mais des fois il se trouve après les deux CRLF, juste avant le corps
      Je ne connais pas les capacités de IceWarp mais si le serveur a la possibilité d'héberger différents sites/domaines et que tu veux faire un code utilisable pour d'autres cas tu ferais mieux d'utilise HTTP 1.1 en spécifiant le 'Host'

      sinon si tu ne fait qu'un recv c'est sûr que tu vas pas aller bien loin :-/

      à ta place j'utiliserais une librairie HTTP existante.
      je te conseille celle-là :
      http://www.softorchestra.com/downloads/
      extrêmement légère (44ko) et efficace
  • # Sock HTTP sur IceWarp version : 4.1 (l'enfer me riegne!)

    Posté par  . Évalué à 1.

    Bonjour.
    Voilà j’aurais encore des questions par rapport a mon problème.
    A premier vu le serveur distant est en faite un serveur Windows.
    Apres une rechercher sur le net, j’ai pu remarquer que des serveurs http on une différence entre Linux et Windows, ou certains type/version de serveur web : Le retour de chariot entre autres (\r\n\r\n, \n\n, etc.)

    Donc, dans mon code comment savoir que mon retour de chariot est bon a la requête du GET ?

    Autres choses que je pense qui a pu m’induire en erreur jusqu’ici, dont j’aimerais savoir ce que vous en penser...

    Etant donner que le code d’une page HTML peut contenir des caractères du genre : </>" \’
    Pensez vous que il est possible que dans ma variable empf_buffer il est possible que le code HTML serais interpréter ? Ce qui pourrais éventuellement expliquer la raison de pourquoi je n’obtiens pas contenue de la page comme je l’aimerai ?

    Bref, qu’il pourrait réellement m’aidé ? Sa fait plusieurs jours que je reste callé sur bête problème… Sa ne doit pas être vraiment sorcier de pouvoir faire une communication entre un serveur web et sont code, alors que le serveur web quand vous prenez Telnet, que vous vous connecter que vous entrer le Get….. Et deux enter vous donne devant les yeux sans problème le code.

    (Ce qui reviens à me faire dire que ce soit c’est un problème de retour de chariot, ou d’interprétation du code qui bug)

    Merci pour TOUTES les réponses qui pourront éventuellement me guidé un peu plus, et de me consacrer un morceau de votre temps a ce petit problème de novice.
    • [^] # Re: Sock HTTP sur IceWarp version : 4.1 (l'enfer me riegne!)

      Posté par  . Évalué à 2.

      1. Conseil: bosses la grammaire française, c'est utile pour se faire comprendre et ce n'est pas une perte de temps.
      2. Quand je lis des choses comme "Pensez vous que il est possible que dans ma variable empf_buffer il est possible que le code HTML serais interpréter ? ", outre le fait que je dois relire 3 fois pour comprendre ce que tu essayes de dire, je me dis que tu n'as vraiment rien compris ni au protocole HTTP, ni au langage HTML, ni même à ton propre code (c'est vraiment le tient?).

      Donc: essayes déjà de comprendre ce que tu dois faire et comment tu dois le faire avant d'écrire du code. Déjà que tes notions (sans même parler de niveau) de programmation sont apparement très faibles (interprétation spontanée de code HTML ... gni ???), il te sera diffice de coder quelque chose dont tu n'as pas compris le fonctionnement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.