Progression d'un "Sendstream" [Résolu]

rivarol89 19 Messages postés dimanche 27 février 2005Date d'inscription 22 avril 2010 Dernière intervention - 4 janv. 2007 à 23:09 - Dernière réponse : cs_darkcodersc 7 Messages postés lundi 17 mars 2008Date d'inscription 20 novembre 2009 Dernière intervention
- 15 oct. 2009 à 12:05
Bonjour a tous,

Depuis pas mal de temps je cherche à programmer une barre de progression pour un upload,
en utilisant l'expression suivante :

Socket.SendStream(TFileStream.Create(open.FileName, fmOpenRead or fmShareDenyWrite));

Comment récupérer la progression de l'envoit du fichier (nombre d'octets envoyés) ?

Merci d'avance pour vos réponsesqui me seront d'une grande aide !

@++
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 6 janv. 2007 à 14:23
3
Merci
Pfffou, j'ai même plus les TSocket sur Delphi tellement que c'est obsolète.

Un conseil: passe à Indy (version 9 ou 10): c'est bien, ça marche, c'est simple mais en même temps tu aura accès à des fonctions drôlement pratiques (comme les évenements OnWork...).

Je dis la même chose à ceux que je vois en train de programmer en TurboPascal pour Windows 98. C'est rigolo 30 secondes, mais faut passer à mieux, d'autant que les TSockets ne sont plus mis à jour ni rien d'autre.

Par contre, c'est obligatoirement bloquant. Mais je trouve ce mode bien plus pratique.

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de florenth
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 5 janv. 2007 à 16:25
0
Merci
Salut,

La propriété FileStream.Position permet d'obtenir la position en cours dans le flux. Il s'agit du nombre d'octets depuis le début du flux de données.
Commenter la réponse de Caribensila
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 5 janv. 2007 à 20:16
0
Merci
Le truc, c'est que si son socket est bloquant, il n'aura pas moyen de récupérer la position puisque le programme ne passe à la ligne d'après qu'une fois le transfert fini.

La seule solution alors serait d'utiliser les composants Indy et de faire la mise à jour de ta progressbar dans les évenements OnBeginWork, OnWork et OnEndWork.

A part ça, tel que codé là (je ne vois pas ce que fait Socket.SendStream) mais ton flux n'a pas l'air d'être libéré une fois envoyé... Aïe...
Commenter la réponse de florenth
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 5 janv. 2007 à 20:55
0
Merci
function SendStreamGlobal(const FileName : string; Socket : TSocket) : boolean;
var TFS : TFileStream;
begin
    result := false;
    TFS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try 
      if Assigned(Socket) then begin
         Socket.SendStream(TFS);
         result := true;
      end;
   finally
      TFS.Free;
   end;
end;

<hr size="2" width="100%" />Croc (click me)
Commenter la réponse de f0xi
Utilisateur anonyme - 5 janv. 2007 à 21:43
0
Merci
Salut,

Déjà le truc a ne pas faire : Socket.SendStream(TFileStream.Create(open.FileName, fmOpenRead or fmShareDenyWrite)); : Definition meme de ce qu'il ne faut pas faire.
MyStream:=TFileStream.Create(open.FileName, fmOpenRead or fmShareDenyWrite);
Socket.SendStream(MyStream);

@Florenth : A priori il n'utilise pas Indy mais TSockets. Donc son socket n'est pas bloquant. Juste petite remarque : TSocket il faut oublier.

Pour Indy (TidTCP) il y a la procedure OnWork pour récupérer la progression.

Ensuite pour les composants TSocket : tu devrais aller faire un tour du coté de Borland en ce qui concerne TSocket et les streams. On peut pas les utiliser en mode non bloquant (Idem avec ICS). On utilise alors Socket.SendBuf qui te renvoit un integer : a toi de comprendre à quoi il correspond
Commenter la réponse de Utilisateur anonyme
rivarol89 19 Messages postés dimanche 27 février 2005Date d'inscription 22 avril 2010 Dernière intervention - 6 janv. 2007 à 03:06
0
Merci
La proposition de f0xi a l'air interessante en tout cas lorsque j'utilise la commande

tfs.position

il n'y a pas d'erreur par contre le : progressupload.progress:=tfs.position
ne donne rien...

peut etre que comme le dit Florenth (lol ta le meme nom que moi ;) )... hem hem
ben peut etre que le :

progressupload.progress:=tfs.position

ne s'execute qu'apres le transfert...

en tout cas j'utilise le code suivant et je tien a rester sur les Tsocket :

function SendStreamGlobal(const FileName : string; Socket : TclientSocket) : boolean;
begin
    result := false;
    TFS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      if Assigned(Socket) then begin
         Socket.Socket.SendStream(TFS);
         filesmanager.uploadprogress.progress:=tfs.Position;
      end;
   finally

   end;
end;

voila merci pour vos réponses, je cherche encore mais si vous pouvez m'aider ce serais vraiment cool, merci d'avance.

PS: Quelqu'un connait le fonctionnement du fbp (firewall bypass) j'ai deja fais quelque recherches sur l'injection de dll mais je n'ai pas encore assez de connaissances (rien d'illégal mais je trouve le principe fort interessant...)...

@++
Commenter la réponse de rivarol89
rivarol89 19 Messages postés dimanche 27 février 2005Date d'inscription 22 avril 2010 Dernière intervention - 7 janv. 2007 à 02:11
0
Merci
Florenth....  EN fait je vien de lire quelques cours sur les composants Indy et il est vrai que ca a l'air beaucoups plus pratique que les TSocket....

Alors je vais me reconvertir dans le indy qui apparement facilite la vie et surtout au niveau des transferts de fichiers...

Merci d'avoir fais en sorte que je m'y interesse

Mais à propos du firewall bypass ? quelqu'un s'y connait un peu ?

Merci pour vos réponses.

@++
Commenter la réponse de rivarol89
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 7 janv. 2007 à 02:25
0
Merci
Avec Indy, tu peux aussi étudier la classe TThread...  :)))
Commenter la réponse de Caribensila
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 7 janv. 2007 à 20:54
0
Merci
Qu'est ce que tu appelles par "firewall bypass" ?
Tu veux outrepasser le firewall de ton ordi pour accéder à n'importe quel site ou bien empècher la boite de dialogue du firewall windows demander quoi faire ?
Commenter la réponse de florenth
rivarol89 19 Messages postés dimanche 27 février 2005Date d'inscription 22 avril 2010 Dernière intervention - 9 janv. 2007 à 01:08
0
Merci
Bon Indy c'est pratique, il est aisé d'envoyer des information du client vers le serveur mais je commence a perdre espoir, car je recherche une connection unique entre le serveur et le client afin d'échanger des données dans les deux sens (serveur vers client et client vers serveur...).

J'ai réussit a faire transférer un fichier depuis un client vers le serveur mais impossible de trouver sur le web comment le faire dans le sens inverse, je n'ai pas trouvé non plus comment envoyer du texte a partir du serveur sans pacer par la procédure Onexecute...
La question est la suivante :

Peut on envoyer un flux de donnée par exemple depuis un serveur vers un client sans passer par la procédure Onexecute (peut on deja le faire ainsi ?), si oui comment, si non quel est le meilleur moyen pour le faire ?

Pour répondre a Florenth :

Non je parle bien du principe suivant :
                                                                             |  |
.exe(port 666) ------------->  Pas d'autorisation ! |F|
                                                                             |I |
                                                                             |R|
                                                                             |E|
.exe---->injection------->iexplore.exe(port 80)->autorisé-------> N E T
                                                                             |W|
                                                                             |A|
                                                                             |L|
                                                                             |L|
                                                                             |  |

Le programme malicieux injecte son code dans un processus qui a une autorisation pour l'acces a l'extérieur (iexplore.exe par exemple) et a ainsi acces a internet ni vu ni connu, c'est ce qu'on appelle du travaille propre quoi...

J'ai deja fais quelques recherche la dessus mais c'est pas aisé, la documentation est assez restreinte... Donc voila pourquoi je demande si quelqu'un s'y connait (en delphi )..

Donc voila j'ai posé mes questions, j'ai fais un joli dessin maintenant j'espère que vous pourez m'aider  Merci d'avance pour vos réponses.

@++                                                                                                                                  
Commenter la réponse de rivarol89
cs_darkcodersc 7 Messages postés lundi 17 mars 2008Date d'inscription 20 novembre 2009 Dernière intervention - 15 oct. 2009 à 12:05
0
Merci
On appel sa la methode FWB++ ( Firewall bypass ) va voir du coté de chez Aphex.
Commenter la réponse de cs_darkcodersc

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.