Socket Protocole HTTP

Signaler
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
-
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
-
Bonjour,

J'ai fait un proxy qui intègre un serveur WEB et lorsque que je lui demande de s'interroger, je me rends compte qu'il y a une erreur.
Cette erreur dit que la connexion a été réinitialisée par un tiers.
Dans un premier temps on se dit que c'est normal car dans l'en-tête on précise "Connection: close" mais si on interroge un serveur apache aucune erreur.
Le serveur apache va renvoyer une réponse dont le nombre de caractères est nul pour faire comprendre au proxy de clore la connexion (avec toujours le paramètre connection: close dans l'en-tête de la réponse).

Je précise au passage que la réponse, des fois, n'est pas transmis dans son intégralité au client à cause de cette erreur du client. Une erreur d'envoi ne survient pas sur le serveur seulement un erreur de réception sur le serveur.
J'ai essayé d'envoyer une chaine vidée (si on en fait deux c'est le même résultat) :

            send(id_de_la_socket, "", 0,0);
 mais ça marche à moitié : explications :
Le client reçoit tout et même l'erreur. Donc le problème de cette erreur n'est pas résolu et en plus il ne reçoit pas de vide lui indiquant de fermer la connexion.

Bien entendu je fais un shutdown puis un closesocket côté serveur pour clore la connexion avec le client.

Comment faire pour faire comme apache ?

Merci d'avance et bonne prog,
@++

Le créateur du site http://victorlogiciels.com

8 réponses

Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Bonjour,

Personne ne connait les socket ni le protocole HTTP ?

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
salut,

eh ben tu explores le code d'apache ;)

non, sinon, envoyer 0 octets forcément ca envoie rien...normalement, un serveur web renvoie au moins 200 OK...mais peut être que je me trompe...

dans tous les cas, je n'ai pas tout compris à tes explications...par exemple, est-ce que ton code traite correctement l'entête Connection...

ShareVB
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Bonjour,

Essaye de créer une connection avec apache avec une page qui renvoi un connection close et tu comprendras.

Le serveur envoie les données puis envoie 0 octets pour te dire de clore la connection.
C'est ce 'signal' qui me manque.

Si tu trouves le code d'apache fais moi signe.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
salut,

la seule chose que je vois c'est que le serveur renvoie la réponse avec une entête Connection: close puis ferme la connexion...à la limite, je veux bien penser que la réponse contient une ligne vide à la fin "\r\n" mais bon...et puis met le flags RST de l'entête TCP à 1 pour dire connection terminée...mais cela n'a rien à voir avec HTTP...

le code source se trouve facilement, mais le fichier et l'endroit précis où ce que tu cherches se trouve, c'est autre chose :
http://www.apache.org/dev/version-control.html
http://www.apache.org/dist/httpd/

ShareVB
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Bonjour,

Comment fais-tu pour mettre le flag reset ? (c'est un closesocket ou un shutdown ?)

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Bonjour,

Si tu fais une boucle de réception, en gros ça fait ça :

while (recv[...]>0)
{
    [...]
}
if ([...]==SOCKET_ERROR)
{
    [...]
}

Avec apache aucune erreur ne se produit et la connexion est bien fermée.
Avec mon proxy l'erreur socket et déclenchée et indique "reset by peer"
Voilà le vrai problème.
Sous Firefox aucun problème mais si j'interoge mon proxy avec une boucle de réception de ce genre il reçoit tout en local et génère une erreur et en réseau il reçoit une partie puis l'erreur.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
7
Bonjour,

Biensûr je n'ai pas dit que ça venait forcément de HTTP mais je précise que j'utilise ce protocole.
C'est sûrement des sockets que provient ce problème.

Merci et bonne prog,
@++

Le créateur du site http://victorlogiciels.com
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
20
salut,

à mon avis, en fait, tu fais un algo du genre (je me rappelle plus bien des params et autre valeurs de retour d'erreur) :
while (recv)
{
if (reponse contient "Connection: close")
    normal_de_se_prendre_un_conn_close = 1;

if (erreur_recv && errno ==  "reset by peer")
    if (normal_de_se_prendre_un_conn_close)
       break; //reset by peer normal
    else
       show_error();
}

le falg rst, c'est quand tu close ton socket...

ShareVB