Evoi de donnees tcp/ip avec ics

Signaler
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011
-
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011
-
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

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;
  







Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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.
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

Comment faire pour envoyer des fichiers supérieurs à 4Ko ?
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
Salut,
il me semble que ça doit fonctionner, as tu testé ? as tu des messages d'erreur en retour ? quels sont-ils ?
merci
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;






Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

Merci pour votre aide, quel port est-il conseillé d'utiliser pour le TCP/IP ?
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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 ?
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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 ?
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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à ?
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

Personne pour m'aider ?
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

Toujours personne ?
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
"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 !
Messages postés
122
Date d'inscription
vendredi 19 octobre 2007
Statut
Membre
Dernière intervention
24 février 2011

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ù.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Montre le code complet ?

Cordialement, Bacterius !