Programmation.c : Sock HTTP sur IceWarp version : 4.1
Posté par deffice () le 20 octobre 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
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
> Lire le message (5 commentaires, moyenne: 1,4).
Vous avez demandé le commentaire #766690.



Sock HTTP sur IceWarp version : 4.1 (Eclaircis du probleme/desir)
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’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>
……………………#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’AIMERAIS AVOIR)
frenchnet@ipnode:~$
==========================EXEMPLE==========================
J’aimerais arriver à recevoir grâce a mon sock donc entre DEBUT/FIN DU CODE HTML parce que je ne reçois que l’ente du serveur !? Ceci est mon problème majeur dans ce code !!
Pour le code exotique, je suis désolé j’ai fait tellement de teste de toute les manières que j’approuve le faite dire qu’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’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’url requeté au serveur.
2) Quand l’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’aimerais faire, et le problème associé.
[^]Re: Sock HTTP sur IceWarp version : 4.1 (Eclaircis du probleme/desir)
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