IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Envoi/Reception de fichier en SocketAPI


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut Envoi/Reception de fichier en SocketAPI
    Bonjours,
    J'aimerais savoir comment envoyer un fichier utilisant l'API Socket
    J'ai essayé divers moyens mais aucun malheureusement n'a fonctionné .
    existe t il un exemple ?
    Merci!

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Lorsque tu parles d'API Socket, tu veux dire WinSock directement, comme le fait Paul Toth ?

    Tu peux fournir un bout de code, parce qu'envoyer un fichier, c'est juste envoyé, un message structuré, contenant, le nom du fichier et ensuite son contenu ... en gros, tu reponds un FTP à ta sauce ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut
    Quand je dit Socket API , sa veut dire sans utiliser les composants VCL comme TServerSocket ou TClientSocket , c'est utiliser les sockets a l'etat pur .
    Je voudrai simplement envoyer et recevoir un Fichier entre Client/Server.

    voila un bout de code !

    [Doit recevoir]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    procedure SocketWorkThread(wSock :TSocket);stdcall;
    var
       recvbuf :array[0..8192] of Char;
       Receive,i :Integer;
       cString :String;
       hSock : integer; //Socket Handle
       {Sin Info}
       sID,sIP,sLan,sUCname,sPing,sIdle:String;
       iPing,iNPing:Integer;
       F             :THandle;
       filename:string;
       BytesRead     :Cardinal;
       BytesSize     :Cardinal;
       FileSize      :Integer;
       rFile         :Array[0..8192] Of Char;
       dErr          :Integer;
       Total         :Integer;
    begin
      try
        while true do begin
         hSock := wSock;
         Receive := recv(wSock,recvbuf,buflen,0);
         if Receive < 1 then begin
           {Socket disconnected----------------------------------------------------}
           CloseSocket(wSock);
           ExitThread(0);
           {-----------------------------------------------------------------------}
         end;
         ReceiveTotal := ReceiveTotal + Length(PChar(@recvbuf));
         FrmMain.status.Panels[2].text := 'up : '+IntToStr(ReceiveTotal);
         cString := PChar(@recvbuf);
         {Socket OnRead------------------------------------------------------------}
         Total := 1;
         FileName := 'c:\try.exe';
         F := CreateFile(pChar(FileName), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, 0, 0);
         BytesSize := 0;
         FileSize := 153088;
         SetFilePointer(F, 0, NIL, FILE_BEGIN);
      If BytesSize < FileSize Then
      Begin
        Repeat
          FillChar(rFile, SizeOf(rFile), 0);
          ReadFile(F, rFile, SizeOf(rFile), BytesRead, NIL);
          dErr := Send(wSock, rFile, BytesRead, 0);
          If dErr = -1 Then Break;
          Inc(Total, dErr);
          Recv(wSock, rFile, SizeOf(rFile), 0);
        Until (Total >= FileSize);
         {-------------------------------------------------------------------------}
        end;
        end;
        except
      {Log there}
      Exit;
      end;
    end;
    [Envoi]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Procedure SendFile(Name:String);
    var
        Buf           :Array[0..8192] Of Char;
        T:String;
        F             :File;
        BytesRead     :Cardinal;
    Begin
        {$I-}
        AssignFile(F, Name);
        Reset(F, 1);
        Repeat
          BlockRead(F, Buf, SizeOf(Buf), BytesRead);
          If (BytesRead = 0) Then Break;
     
          Send(S, Buf[0], SizeOf(Buf), 0);
          FillChar(Buf, SizeOf(Buf), 0);
          Recv(S, Buf, SizeOf(Buf), 0);
        Until BytesRead = 0;
        CloseFile(F);
        {$I+}
    End;
    Sa ne marche pas , sa se bloque !

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    ReadFile dans la fonction de reception ?
    C'est pas plutôt un WriteFile ?
    Et tu refaits un Send après ???

    même ta fonction d'envoi, tu veux recevoir ce que tu envois avec ce Recv qui écrit en plus dans le même buffer que celui du fichier, c'est très confu !

    tu devrais avant de t'attaquer au fichier, tu faire une petite classe qui encaspule le socket ou tu enverras des chaines de test, puisque ensuite tu utilisera cette classe pour envoyer un fichier bout par bout ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut
    Le système d'envoi et réception de texte fonctionne parfaitement je suis simplement bloquer pour l'envoi de fichier .
    J'ai essayer de me baser sur l'unit ScktComp pour SendStream et sa bloque toujours au bout des premiers octet envoyer .

    Existe t il un exemple d'envoi de fichier utilisant Winsock ?
    Merci,

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Peux-tu donner ton code d'envoi et Reception pour une chaine, il vaut mieux repartir de ce code fonctionnel que de vouloir modifer le code que tu as fourni, qui n'est pas très cohérent ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut
    J'ai remanier tout le code , et la sa marche pour le transfer mais ! bizarement le fichier est un peu plus gros que l'original , j'ai ouvert avec bloc note , et certaine parties du fichier sont répété plusieurs fois ... mais le fichier s'ouvre correctement dans la plus par des cas :/

    Voila le nouveau code d'envoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure SendFile(FileName:String);
    var size,i,ByteRead : Integer;
        Buf : Array[0..8192] Of Char;
        F : File;
        Name : String;
    Begin
    AssignFile(F,FileName);
    Reset(F,1);
    size := GetFSize(FileName);
    i := 0;
    while i <= size do begin
    i := i+ 8192;
    BlockRead(F, Buf, sizeof(Buf) , ByteRead);
    Send(s,buf,sizeof(buf),0);
    End;
    CloseFile(F);
    {------------------------------------}
    End;
    et dans l'evenement de reception il y a juste un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockWrite(F, recvbuf, sizeof(recvbuf));
    Merci,

  8. #8
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut
    J'ai partiellement résolut le problème , merci de ton aide ShaiLeTroll !

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 158
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 158
    Par défaut
    Salut
    Citation Envoyé par 0x44-0x43-0x53-0x43 Voir le message
    J'ai partiellement résolut le problème , merci de ton aide ShaiLeTroll !
    Et t'as cliqué sur « Résolu » ? ? ?


    Citation Envoyé par 0x44-0x43-0x53-0x43 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var size,i,ByteRead : Integer;
        Buf : Array[0..8192] Of Char; // = 8193 char !
    De 0 à 8192 chez moi ça fait 8193...
    Essaye en comptant sur tes doigts de 0 à 4 : tu vas compter avec 5 doigts,

    Jette donc un oeil à l'exemple de l'aide sur BlockRead, BlockWrite ou SaveDialog.

  10. #10
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Par défaut
    Et t'as cliqué sur « Résolu » ? ? ?
    Oui ! depuis longtemps :p

    De 0 à 8192 chez moi ça fait 8193...
    Essaye en comptant sur tes doigts de 0 à 4 : tu vas compter avec 5 doigts,

    Jette donc un oeil à l'exemple de l'aide sur BlockRead, BlockWrite ou SaveDialog.
    Merci je vais tester si sa marche mieu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoi/reception fichier par socket
    Par rezuz dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 19/06/2010, 16h52
  2. [PHP 5.0] Envoi et reception de fichier XML
    Par j3r3m067 dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2010, 10h43
  3. Probleme envoi/reception de fichiers par RS232
    Par zezitinho dans le forum C++
    Réponses: 2
    Dernier message: 10/10/2007, 10h34
  4. Envoi/Reception de fichier sur un reseau
    Par Janitrix dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 19/12/2005, 14h10
  5. [C#] [FTP] Envoi et suppression fichier sur ftp NON ANONYME!
    Par djsbens dans le forum Windows Forms
    Réponses: 14
    Dernier message: 30/03/2005, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo