SERVEUR HTTP MULTISITES

viarn Messages postés 33 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 21 février 2006 - 19 févr. 2006 à 18:59
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009 - 2 août 2006 à 13:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36128-serveur-http-multisites

jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
2 août 2006 à 13:15
Ok, j'ai compris la différence. Je ferais des essais d'intégration dès que j'aurais le temps.
Merci pour les explications :-)
Utilisateur anonyme
2 août 2006 à 00:36
Ton buffer est découpé en morceaux de 8ko à l'envoi vers le socket mais tout est quand même envoyé d'un coup au socket (x buffers * 8ko). Sur un fichier de 700mo ça peut faire mal, surtout avec plusieurs boucles for imbriquées comme ici ça peut provoquer les blocages de transfert ou des plantages.

Il doit avoir une interaction entre le client et le file reader qui fait que celui-ci lit juste les données nécessaires dans le fichier, si le client annule le téléchargement d'un fichier de 50mo au bout de 1mo inutile de lire et de stocker les 49 autres mo dans le buffer interne du socket :d

Pour résumer : le socket informe du fait qu'il a terminé un envoi (via socket_sendcomplete) et qu'il veut maintenant qu'on lui envoie la suite du fichier pour l'envoyer au client. Ainsi si le client décide de mettre en pause ou si la vitesse de transfert est fortement réduite il ne se passe plus rien, l'appli ne n'utilise plus de cpu. Arrivé à un moment le socket s'aperçoit que la taille des données envoyées est égale à la taille du fichier (ou à la [taille du fichier] - [byte range] si tu gère le resume sur les transferts) toujours dans socket_sendcomplete et à ce moment il se décharge ainsi que son filereader(x) et à aucun moment des boucles, des doevents ou des Sleep n'ont été utilisées, tout s'est passé dans la douceur, en fonction de la rapidité de la connexion du client ;)
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
1 août 2006 à 23:49
Hello,
je me doutais bien qu'il faudrait que je mette en place qq chose de ce genre pour les gros fichiers. Je vais creuser les pistes que tu me proposes, et en tout état de cause je vais examiner ton code avec attention.

Ce que je ne comprend pas, c'est que mon code actuel fait déjà des envois par petits paquets, avec retry en cas d'erreur, etc:
Voici la section qui fait cela (extrait de client_dataArrival()

CopyMemory tba(0), ByVal s, sizeTba

' The idea here is to use the winsock for little amount of data (<8192)
' and to use windows Send function in other cases.
' Several tests prove that this is very efficient.
'
If sizeTba >= WINSCK_LIMIT Then
' Unfortunately, this does not work in all cases:
'sckr = Send(client(Index).SocketHandle, tba(0), sizeTba, 0)

' The solution is to split into shorter packets
For i = 1 To Int(sizeTba / SZ_PACK) + 1
start = (i - 1) * SZ_PACK
size = SZ_PACK
If (sizeTba - start) < SZ_PACK Then
size = sizeTba - start
End If
If G_With_Traces Then
Label1.Caption "start " & start & " size=" & size & " "
Label1.Refresh
End If

' /*************************************************************/
' /* This could certainly be improved... */
' /*************************************************************/

For j = start To start + size
tba2(j - start) = tba(j)
Next j

watch_dog = 0
retr = 0
t1 = Timer
t2 = Timer

sckr = Send(client(Index).SocketHandle, tba2(0), size, 0)
Do While sckr = -1 ' if error
DoEvents ' do events
t2 = Timer
If (t2 - t1) > MAX_TIME_RETRY Then
watch_dog = 1
Exit Do
End If
' and try again
sckr = Send(client(Index).SocketHandle, tba2(0), size, 0)
'DoEvents
Sleep (1)
If sckr = -1 Then
Sleep (5)
DoEvents
End If
DoEvents
retr = retr + 1
If retr > G_Max_Loop_Retry Then
watch_dog = 1
Exit Do
End If
Loop
If G_traces_retry = trace_active Then
txtRetry.Text = retr & vbCrLf & txtRetry.Text
End If
retr = 0
If watch_dog = 1 Then
txtErr.Text = txtErr.Text & "FORCE QUIT LOOP"
Exit For ' EMERGENCY EXIT - BIG PROBLEM
End If
DoEvents
Next i ' end loop short packets

Comme tu vois, je fais déjà un découpgae (en paquets de taille SZ_PACK (=8192 en général)).
Je ne vois pas bien en quoi l'approche que tu proposes est différente, dans le principe?
Est ce que je loupe qq chose?
Utilisateur anonyme
1 août 2006 à 22:47
Le problème de l'upload vient du fait que tu n'utilises pas de file reader adaptatif. Je m'explique, lorsqu'un client lance une requête sur un film (je prends le cas extrême) readFromFile charge 700mo dans szText et l'envoi au socket qui subit alors quelques dommages collatéraux :d (en clair le plantage de l'appli), pour un mp3 ça peut juste ralentir ou faire du zigzag sur la courbe du débit.

En fait tu dois utiliser un file reader qui lit le fichier à la vitesse du client par buffers (je te conseille d'utiliser un contrôle utilisateur qui se charge et se décharge avec le socket)

Ca doit donner un truc du genre "envoi de x octets au socket à chaques send_complete de celui-ci jusqu'à la fin du transfert", x étant la taille du buffer configurable dans ton .cfg.

Tu peux aussi en améliorant cette partie prendre en charge l'ouverture d'un fichier à un byte défini par le client (pour par exemple lire un mp3 à la 221 seconde ou reprendre un téléchargement laissé la veille à l'octet '45544').

Même si ton appli semble être plus destinée aux transferts de petits fichiers (php ect) mieux vaut aussi la rendre irréprochable pour les très gros fichiers.

Pour la lecture de fichiers par buffers tu peux t'inspirer de ma source ;)
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
1 août 2006 à 21:14
Hello,

Kroman => Pas vraiment de problèmes, simplement quand on download un gros fichier, et bien l'envoie fonctionne, mais ce n'est pas très rapide. Pour de très gros fichiers, il y a même des fois ou ça bloque (les send(...) renvoient des erreurs, malgré une logique de retry). Les send() se font dans client_DataArrival().

Renfield => Merci de la revue :-) - Je prends bonne note de toutes tes judicieuses remarques et je compte bien en tenir compte pour intégrer tout cela dans ma prochaine version. Je dois dire que, entrre autre, pour la configuration (avoir une forme pour les params), tu as 100 fois raison, je vais faire cela.

Merci à tous de vos remarques :-)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 août 2006 à 08:39
Ca y est, je me suis décidé a tester ton programme, l'ami.

La "log" se trouvant dans la TextBox IP List n'est pas très lisible
un peu de couleurs, l'ajout de date/heure, et quelques choses du genre enjoliveraient pas mal la chose

Un lien dans le soft pour lancer la doc serait un plus
de même, un fichier chm pourrait être sympa

tu pourrais remplacer tes pictureBoxes psck par des shapes (changement a effectuer en ouvrant le frm dans un editeur de texte).
tu y gagnerais des ressources, les shapes ne sont pas des fenêtres, mais sont simplement dessinées sur la Form (comme les Labels ou les Lines)

Sympa, ton module Concat, tu as été a bonne école ^^
à noter que la fonction Space$ est plus rapide que String$(BUFFER_CHUNK_SIZE, 0)

un peu de Francais dans ton soft en anglais (que tu pourrais localiser, par ailleurs ^^) :
Public Const G_EXEC_QUERY_OK As String = "Exécution de la requête réussie."

le taux de personnalisation de la configuration est assez impressionnant
néanmoins, une Form pour editer ces paramètres (au moins quelques uns) ne serait pas un luxe.

"Note: il est possible d'utiliser le signe $ pour indiquer le répertoire courant
(le répertoire dans lequel se trouve l'exécutable:"
Bonne initiative. un point aurait pu suffire, et est plus 'naturel' :
".\db.mdb"

ton maproot.cfg pourrais devenir un bon module de réécriture d'URL
exit donc les $ et bienvenue aux RegExp. Par exemple, tu pourrais faire :
IF $HOST = "Monsite.perso.provider.com"
AND RegExp ( $URL, "http://[^/]+/([^/]+)/",0) = "christine"
THEN $PATH = "C:\DOCUMENTS\CHRISTINE"

je te laisse voir si ca peut t'interesser, on peux faire des choses sympa avec ce genre d'outils... (comme interdire les liens exteirurs directs sur tes ressources images, exe ou autres, rendre des irl plus humainent lisibles, etc

deconnect => disconnect

je regarderai la chose en fonctionnement plus tard
Utilisateur anonyme
1 août 2006 à 00:22
Avec le code du systray ça sera parfait :)

Quel est le problème exact avec l'upload?
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
31 juil. 2006 à 21:10
Mise à jour: ajout du répertoire /navig/ contenant les ressources pour la navigation web.
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
31 juil. 2006 à 21:04
Hello,
merci de ton commentaire!

- pour le débit en upload, je n'ai pas réglé le problème, je suis toujours au limite de ma connexion, mais si tu as un remède magique, je suis bien sur preneur :)
- Pour la navigation web, j'ai omis de mettre les images dans le package de distribution, je vais en refaire un, merci de le signaler.

- Le code pour le systray est fait, je m'apprétais à l'intégrer dans la prochaine release :-)
Utilisateur anonyme
31 juil. 2006 à 02:49
Très bon code! Il y a vraiment un gros boulot de fait!

Tu parles dans la doc (très soignée et complète en passant) d'un problème de débit en upload où tu penses qu'il s'agit de ton fai (§4.1), as-tu résolu ce problème? (car j'ai connu ce problème à une époque aussi et je peux te venir en aide au cas où...).

Je n'ai pas trouvé les images dans le zip de la navigation web dans les dossiers (le dossier "http://localhost/navig/") donc ça m'affiche des erreurs à la place des images, je me suis planté quelque part?

Enfin, il reste peut être plus qu'à intégrer un code pour le réduire dans le systray et ainsi pouvoir démarrer Windows avec Rabbit en fond et ça sera parfait :)
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
28 juin 2006 à 13:38
Hello,

Cette version est la toute dernière (3.07.0008), comme indiqué dans l'historique.
Elle inclut bon nombre de nouvelles fonctions, et la documentation fournit (le fichier pdf) est à jour. On peut donc la télécharger ici même.

Cordialement;
SHELLDENZI Messages postés 1 Date d'inscription jeudi 20 avril 2006 Statut Membre Dernière intervention 26 juin 2006
26 juin 2006 à 04:15
Salam ^_^

Ou on peu télécharger la derniére version sil vous plait ?
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
18 juin 2006 à 12:12
Hello,
La dernière version est maintenant disponible, elle intègre un grand nombre de nouvelles focntionnalités. Vous pouvez télécharger le package ici. Pour ceux qui sont déjà installés, il y a des ajouts à faire dans le fichier de config et dans la DB pour profiter des nouvelles fonctionnalités.
Tout est expliqué dans la doc.
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
2 mai 2006 à 21:00
Hello,
a) Intégrer un bouton pour voir index.htm
Je ne comprend pas la question. Rabbit est un serveur, pas un client.
b) Connaitre son adress IP
Le serveur ne connais pas son adresse IP, peu lui importe. Par contre, il suffit de faire une page html avec %%IP%% et %%FORWARDED_IP%% pour connaitre l'IP du client, donc sa propre IP :-)
c) forum, chatroom, webcam, etc
Oui, mais rien à voir avec un serveur. Ca ce sont des applications clientes.
Pour info, il suffit d'écrire les CGI qui vont bien et le tour est joué.
pirate softwarez Messages postés 16 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 14 novembre 2007
26 avril 2006 à 18:08
Salut Jean-Marc je trouve que ton projet pas mal complet car j'en ai pas mal essaiyé des Codes de Serveur HTTP sur VBFRANCE mais le tient il à l'air pas complet juste un hic j'ai lue ta doc mais je n'arrive pas à le faire fonctionne pourtant j'ai bien lue la doc moi je roule sur Win XP Pro SP2 en passant ca serait pas mal cool si tu pourrait intégrer un Bouton pour qu'on puisse ouvrir la feuille principale comme index.htm pis aussi de savoir son adresse ip et aussi d'y intégrer un Forum, un Chatroom avec option de Webcam ect... Moi je suis débutant en passant Merci et à bientot je te met 9/10 bye bye!
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
18 avril 2006 à 20:03
Hello,

Super, merci du feedback, très sympa!
J'ai noté tes remarques et commentaires, je suis bien sur tout à fait partisan de les intégrer à Rabbit de façon "officielle" et documentée.

Je vais essayer de te contacter pour voir comment on peut intégrer tout cela.

Encore Merci, et à bientôt. Pour me contacter: jean-marc.n@tiscali.be
MickeyDoom Messages postés 8 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 15 septembre 2011 2
16 avril 2006 à 11:20
Salut, Jean_marc
Super programme, il m'a fait gagné beaucoup de temps. je l'utilise pour qu'il récupère des données et stats d'une applic a moi (grace aux cgi) et j'ai apporté quelques modifs. Je te les ennumères pour peut-être que tu les les intégre à ton source.
-ajout pour la sécurite une option qui permet d'obliger l'identification par login/pass avant de pouvoir faire quoi que ce soit avec une durée d'inactivé avant déconnexion paramètrable.
- Execution dans le system tray pour qu'il s'execute sans géner.
- Ajout de la reconnaissance d'une synthaxe spéciale "~~" (~~index.htm par exemple) pour lire des pages web dans la base de données et non sur disque. Voila ou j'en suis pour le moment.

Ce qu'il manque (à mon avis) pour qu'il soit encore mieux
---------------------------------------------------------
Une fonction de gestion distante(par un navigateur) des fonctionnalitées existantes de rabbit(Ajout, suppression, modification pour : les Utilisateur, les détails de logs, les bans, les restrictions...) Je suis en train de faire les modifs pour moi.

A++
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
8 avril 2006 à 10:09
Hello,

Merci du commentaire :-)

Ce sont les options de sécurité de SP2 qui quand elles sont mal configurées peuvent empécher le programme de focntionner. Voir aussi si il ya tout ce qu'il faut pour Access. Moi, j'ai testé sur XP (Pro, Home, SP1, SP2), 2000 (Pro et serveur), 2003 (Pro et serveur) et même win98, sans soucis particuliers.

Bien sur, je suis intéressé pour avoir du retour en cas de problème de fonctionnement.

A+
ludbest1 Messages postés 14 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 13 février 2012
8 avril 2006 à 03:13
Bonjour JM, chez moi ça marche nickel sur XP pro SP1, parcontre sur le SP2 ça foire.......

Prog. nickel rien à redire...cesi fait l'objet d'une tres bonne note je met 9/10

salutation à tous....
PS: il serait intéressent de développer le secteur PHP....;-)
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
26 févr. 2006 à 09:07
Bonjour JazzRock,
Tout d'abord merci pour vos remarques. Concernant votre question, je vais essayer d'y répondre au mieux, n'hésitez pas à développer si mes réponses ne sont pas pertinentes.
Les pages HTML conçues pour être utilisées par Rabbit (par exemple contenant du SQL) ne peuvent être servies QUE par Rabbit, en ce sens que c'est Rabbit (et pas un autre Serveur Web classique) qui va interpréter les spécificités de la page.
Une application Rabbit (par exemple un CGI écrit pour Rabbit spécifiquement) devra être légèrement modifié pour pouvoir être utilisé par un autre serveur Web, mais juste une adaptation mineure: écrire sur la sortie standard (STDOUT) plutot que dans un fichier.

Si ce n'est pas clair, ne pas hésiter à me poser des questions supplémentaires, ici ou en mail privé (voir mon profil).
cs_jazzrock Messages postés 3 Date d'inscription dimanche 19 février 2006 Statut Membre Dernière intervention 14 mars 2006
26 févr. 2006 à 07:46
Bonjour JM, bonjour à tous
je ne suis pas programmeur, amateur seulement, et très satisfait de l'énorme travail qui nous est proposé, j'ai lu la doc avant une quelconque manipulation, là encore un gros travail nous est livré, lorsque j'ai créé les exe tout a marché parfaitement.
Une quetion cependant, est-il possible de porter l'application simplement sur un serveur web déja existant sans les contrarier ( appli rabbit et serveur existant)?
Merci et encore bravo
9/10
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
22 févr. 2006 à 19:57
Tout le code dans une même forme, c'était volontaire à la base. Comme on le constate facilement, il est extrèmement modulaire et l'absence quasi-totale de variables globales le rend tout simple à découper en modules physiques.
Je le ferais certainement un jour, pour les prochaines versions. Quand à la correction et l'efficacité, ce code tourne en production sur 3 ou 4 sites (plus pour mon usage personnel) et je n'ai à ce jour pas reçu de "Fault Report" :-) Merci du feedback!
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2006 à 09:49
dommage que tout le code soit sis dans une seule et même form, mais il a l'air correct, ce code.... et efficace
jean_marc_n2 Messages postés 170 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 24 janvier 2009
19 févr. 2006 à 20:53
Oui en effet la lecture de la documentation est indispensable car elle explique comment adapter le fichier de configuration à son propre environnement, ce qui est un pré-requis pour faire fonctionner le serveur. Merci pour le commentaire :-)
viarn Messages postés 33 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 21 février 2006
19 févr. 2006 à 18:59
Félicitation, c'est très bien et très intéressant. J'ai regardé sur le site pour voir comment ça tourne. Je n'ai pas réussi à le démarrer sur ma machine mais c'est normal j'ai pas encore lu la doc. Je m'y plonge. Bonne continuation.

Vincent 9/10
Rejoignez-nous