Evoi de donnees tcp/ip avec ics

beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011 - 30 mars 2009 à 11:52
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011 - 11 mai 2009 à 09:04
Bonjour, je dois réaliser un client/serveur qui doit permettre l'envoie de fichiers via TCP/IP, j'arrive à envoyer une chaîne de caractère, mais je bloque complètement pour les fichiers. J'ai commencé à faire un bout de code mais ça ne fonctionne pas. Pouvez-vous m'aider ?
 
Coté client :
SessionConnected
var
   fs : TFileStream;
   Buf : array[0..4095] Of Byte;
begin
      fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\a.pdf', fmOpenRead);
      fs.Read(Buf, SizeOf(Buf));
      fs.Write(Buf, SizeOf(Buf));
      WSocket1.Send(fs, SizeOf(Buf));
end;

Coté serveur:
DataAvailable
var
   fs : TFileStream;
   Len : int64;
   Buf : array[0..4095] Of Byte;
begin
   //Création du Filestream
   fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\Bureau\azerty.pdf',fmCreate);
   Len:= WSocket1.Receive(@Buf, SizeOf(Buf));
   fs.Write(Buf, Len);
end;

Merci

24 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 mars 2009 à 15:30
type comun:

const
  StreamDataSize = 4096-256-8-4-4;

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    FileCRC  : LongWord;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);
   

envois :

var
  RD : integer;
  PQ : TStreamPacket;
begin
  PQ.FileName := ExtractFileName(FileNameToSend);

  with TFileStream.Create(FileNameToSend, fmOpenRead) do
  try
    PQ.FileSize := Size;
    // PQ.FileCRC := CRC32(FileNameToSend); // voir mon api TinyHash
    Position := 0;
    PQ.DataSize := StreamDataSize;
    while PQ.DataSize = StreamDataSize do
    begin
      PQ.DataSize := Read(PQ.Datas, StreamDataSize);
      WSocket1.Send(PQ, StreamPacketSize);
    end;
  finally
    free;
  end;
end;

reception :


var
  PQ : TStreamPacket;
  NewSize : int64;
  FileNameReceived: string;
begin
  WSocket1.Receive(@PQ, StreamPacketSize);

  FileNameReceveid := IncommingDirectory+PQ.FileName;
  with TFileStream.Create(FileNameReceveid, fmCreate) do
  try
    if Size < PQ.FileSize then
    begin
      Position := Size-1;
      Write(PQ.Datas, PQ.DataSize);
      NewSize := Size;
    end;
  finally
    free;
  end;
  {
  if NewSize = PQ.FileSize then
    if CRC32(FileNameReceveid) <> PQ.FileCRC then
      // declancher une erreur de verification des sommes du fichier
  }
end;
  







0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
30 mars 2009 à 16:17
Merci beaucoup ça fonctionne parfaitement, j'ai juste fait une petite modif pour l'envoi :
WSocket1.Send(@PQ, StreamPacketSize);
Sinon j'avais une erreur de type.
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
30 mars 2009 à 17:03
Comment faire pour envoyer des fichiers supérieurs à 4Ko ?
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
30 mars 2009 à 17:10
Salut,
il me semble que ça doit fonctionner, as tu testé ? as tu des messages d'erreur en retour ? quels sont-ils ?
merci
0

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

Posez votre question
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
30 mars 2009 à 17:30
J'ai testé avec un pdf de 2Mo et .doc de 50Ko. Le fichier se créé normalement, mais les fichiers ne pèsent que 250o et donc il n'y a rien de lisible dedans.
par contre un fichier txt de 3Ko fonctionne parfaitement.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
30 mars 2009 à 18:01
type comun:

const
  StreamDataSize = 4096-256-8-4-4;

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    FileCRC  : LongWord;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);
   

envois :

var
  RD : integer;
  PQ : TStreamPacket;
begin
  PQ.FileName := ExtractFileName(FileNameToSend);

  with TFileStream.Create(FileNameToSend, fmOpenRead) do
  try
    PQ.FileSize := Size;
    // PQ.FileCRC := CRC32(FileNameToSend); // voir mon api TinyHash
    Position := 0;
    PQ.DataSize := StreamDataSize;
    while PQ.DataSize = StreamDataSize do
    begin
      PQ.DataSize := Read(PQ.Datas[0], StreamDataSize);
      WSocket1.Send(PQ, StreamPacketSize);
     
    end;
  finally
    free;
  end;
end;

reception :


var
  PQ : TStreamPacket;
  NewSize : int64;
  FileNameReceived: string;
begin
  WSocket1.Receive(@PQ, StreamPacketSize);

  FileNameReceveid := IncommingDirectory+PQ.FileName;
  with TFileStream.Create(FileNameReceveid, fmCreate) do
  try
    if Size < PQ.FileSize then
    begin
      Position := Size-1;
      Write(PQ.Datas[0], PQ.DataSize);
      NewSize := Size;
    end;
  finally
    free;
  end;
  {
  if NewSize = PQ.FileSize then
    if CRC32(FileNameReceveid) <> PQ.FileCRC then
      // declancher une erreur de verification des sommes du fichier
  }
end;






0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
30 mars 2009 à 21:02
Il me semble qu'on ne peut pas envoyer plus de 64Ko à la fois sur un socket ... et qu'il faut donc faire petit paquet par petit paquet ...

Cordialement, Bacterius !
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
31 mars 2009 à 09:51
Je viens à nouveau d'essayer, comme dit précédemment un fichier de 4o(et pas 3Ko comme plus haut), ça fonctionne très bien, mais pour 59Ko et 2Mo ça ne marche plus, un fichier est généré portant le nom de celui de l'envoi qui fait 224o et un autre avec un nom bizarre qui n'a aucune extension.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
31 mars 2009 à 14:12
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
1 avril 2009 à 15:52
Merci pour votre aide, quel port est-il conseillé d'utiliser pour le TCP/IP ?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 avril 2009 à 16:40
Tous, sauf ceux réservés exclusivement aux autres protocoles.
Autres protocoles (extrait de CCM) :

21 FTP
23 Telnet
25 SMTP
53 Domain Name System
63 Whois
70 Gopher
79 Finger
80 HTTP
110 POP3
119 NNTP

Donc tous les autres sont utilisables pour le TCP/IP je pense (il s'agit du protocole de base).

Cordialement, Bacterius !
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
2 avril 2009 à 10:52
Merci pour le lien précédent, mais je n'arrive toujours pas à envoyer de gros fichiers, et il faut impérativement que j'utilise les WSocket, comment pourrais-je faire un envoi de plusieurs paquets d'un fichier ?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
2 avril 2009 à 16:58
Ben tu envoies par exemple 50K par 50K et tu envoies dans chaque paquet le numéro du paquet, ainsi que le nombre de paquets. A la fin, le destinataire a tous les paquets, il n'a plus qu'à reconstituer le fichier dans l'ordre de paquets ?

Cordialement, Bacterius !
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
6 avril 2009 à 09:18
Il y a une chose que je n'ai pas bien compris dans le code, c'est cette ligne :
  StreamDataSize = 4096-256-8-4-4;
Pouvez-vous me l'expliquer ?
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
6 avril 2009 à 13:44
Je viens de regarder attentivement l'envoi, en fait ça l'envoi bien par paquets, avec la bonne taille par rapport au fichier d'origine, seulement le poids du fichier reçu est celui du dernier paquet envoyé, comment remédier à celà ?
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
7 avril 2009 à 09:03
Personne pour m'aider ?
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
8 avril 2009 à 16:51
Toujours personne ?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
8 avril 2009 à 16:58
"Je viens de regarder attentivement l'envoi, en fait ça l'envoi bien par paquets, avec la bonne taille par rapport au fichier d'origine, seulement le poids du fichier reçu est celui du dernier paquet envoyé"

J'imagine que c'est un problème d'envoi séquentiel des paquets au niveau de l'émetteur des paquets ...

Cordialement, Bacterius !
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
8 avril 2009 à 17:23
Je ne sais pas trop, en tout cas à la réception les tailles des paquets sont identiques à celles de l'envoi, je pense que c'est l'écriture du fichier qui ne fonctionne pas, mais je ne vois pas où.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
8 avril 2009 à 17:47
Montre le code complet ?

Cordialement, Bacterius !
0
Rejoignez-nous