Probleme avec les «Fameux Sockets»!!!

ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008 - 25 juil. 2008 à 08:00
 Utilisateur anonyme - 25 juil. 2008 à 21:34
Chers membres DelphiFR,

J'ai un probleme flagrant avec les composantes TServerSocket et TClientSocket.... je sais je sais épargnez moi les oh mon dieu c'est désuet , utilisez ICS ou Indy !!
Je n'ai jamais eu de probleme avec eux jusqu'a aujourd'hui, c'est tres simple , c'est leger et c'est asynchronous aussi !

Lorsque je tente d'envoyer du texte plus gros que mon buffer du socket avec SendText, le texte se fait couper (Logique non ? )!
Je travail en Non-Blocking mode, j'ai pas reelement besoin de l'autre mode!

Sachant que SendText equivaut a SendBuf(Pointer(text)^,lenght(text)) ....

Comment envoyer le texte (qui est souvent plus gros que 100 ko), jai penser a «splitter» ma string en plusieur partie et envoyer le tout ... et reassembler le tout a la reception

Apres des heures de recherche sur google je n'abouti a toujours a rien de concluant

J'ai aussi assayer de convertir ma longue string en TStringStream puis de lenvoyer avec SendStreamThenDrop, sa fonctionne partiellement (jai recu que la moitier du texte mais beaucoup plus qu'avec SendText!! ...)

ah oui et je recoit un Invalid Pointer Operation (je suis sur que cest lui qui fait planter mon texte et qui fait que jai obtenue seulement 60 % du texte)

Je vous en donne un extrait du code problematique (version avec TStringStream)

//CODE coter client lors de la reception du STREAM Texte ! (ecrit dans un fichier texte coter client, oui il i a un Create et Free pour TXTStream2 , il sont dans OnConnect et OnDisconnect (pas afficher))
procedure TForm1.ClientTXTRead(Sender: TObject; Socket: TCustomWinSocket);
var
iLen: Integer;
Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  try
    Socket.ReceiveBuf(Bfr^, iLen);
    TXTStream2.Write(Bfr^, iLen);
  finally
    FreeMem(Bfr);
  end;
end;

//CODE Coter serveur quand le client se connecte,,, automatiquement lui renvoyer la string (Form3.outtxt)

procedure TForm1.ServerTXTClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
txtStream: TStringStream;
begin

txtStream : = TStringStream.Create(form3.outtxt);  //***Selon le breakpoint que jai mit ici jai un Invalid Pointer Operation qui arrive a TXTStream.Free mais cest surement a la ligne du TStringStream.Create ou SendStreamThenDrop!!!
Socket.SendStreamThenDrop(txtstream);
txtstream.Free;

end;

Es-ce que quelqun aurais une idee pour le Invalid Pointer Operation ? Et aussi pour SendText ?

Bonne journee!

Merci a vous !

Laurent
http://www.xpresstracker.com<strike>
</strike>http://www.qsc-news.com

3 réponses

Utilisateur anonyme
25 juil. 2008 à 14:43
Salut Lolo,

Moi je serai passé par un TStringList et j'aurais envoyé chaque Item au client. En effet les streams coté réception n'ont pas pu être implantés par Borland. Ce qui fait que coté réception tu recois des blocs de donnés. Il peut donc y avoir des "coupures intempestives" si le socket ne recoit rien (encombrement du réseau, débit trop lent ect ect). Du reste pour transferer un fichier si on se réfere aux sources présents (Voir celui de Nono40), on informe déjà de la taille globale des données et on fait une boucle tant que la taille globale recue ne coïncide pas avec la précédente (Chose que toi tu ne fais pas ici et qui est peut etre à l'origine de ton probleme). Un text de 100 ko devrait etre envoyé en tant que fichier (à mon gout) : le TStringList est donc une bonne solution alternative (Il te suffit juste de transmettre le count au client et de faire une boucle jusqu'a que le count coté client soit le meme).

Tu parles d'un pointeur invalide : Surprenant que ca bloque au niveau d'un caractère (As tu pu l'identifier stp ?).

Essaye avec un TStringList et dis nous ce qui se passe .

A+
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
25 juil. 2008 à 20:22
Merci beaucoup Francky23012301 pour ton support !

Juste une petite precision avant de commencer a retravailler sur le probleme... par TStringList, si je comprend bien , sa implique de lire ma string et a toute les CR+LF d'inserer une nouvelle donnee (ligne) dans le TStringList ?
Car bien franchement je ne voit pas aucune autre options pour entrer une longue string dans TStringList, il faut bien la couper pour qu'on aille plusieur mini string dans TStringList puis ensuite looper non ?

Oh tien en ecrivant cette «reply» j'ai penser a charger ma longue string dans un array et puis envoyer par 150-500 (donc 150 bytes-500 bytes) char a la fois dans une loop et verifier si sa c'est bien rendu car j'ai lu quelque part que SendText (et SendBuf) retourne un interger qui equivaut au nombre de char qui n'a pas pu etre envoyer....

Sur ce, je vais continuer a travailler sur le probleme , j'ai penser aussi capturer (un court video avec camtasia) le probleme car je dois t'avouer que c'est plustot dure a expliquer en mots

Merci de me corriger si je me suis gourrer !

Bonne journee,

Laurent

http://www.xpresstracker.com<strike>
</strike>http://www.qsc-news.com
0
Utilisateur anonyme
25 juil. 2008 à 21:34
Pour répondre à ta question :
Tu as saisis l'idée mais regarde dans l'aide de delphi ce qui est dit sur le type TStrings. Il y a des choses qui devraient de plaire
0
Rejoignez-nous