Progression d'un "Sendstream"

Résolu
rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010 - 4 janv. 2007 à 23:09
cs_darkcodersc Messages postés 7 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 20 novembre 2009 - 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 !

@++

11 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
6 janv. 2007 à 14:23
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.
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
5 janv. 2007 à 16:25
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.
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
5 janv. 2007 à 20:16
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...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 janv. 2007 à 20:55
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
5 janv. 2007 à 21:43
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
0
rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010
6 janv. 2007 à 03:06
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...)...

@++
0
rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010
7 janv. 2007 à 02:11
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.

@++
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
7 janv. 2007 à 02:25
Avec Indy, tu peux aussi étudier la classe TThread...  :)))
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
7 janv. 2007 à 20:54
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 ?
0
rivarol89 Messages postés 19 Date d'inscription dimanche 27 février 2005 Statut Membre Dernière intervention 22 avril 2010
9 janv. 2007 à 01:08
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.

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