begin process at 2010 02 10 09:11:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

probleme avec les «Fameux Sockets»!!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

probleme avec les «Fameux Sockets»!!!

vendredi 25 juillet 2008 à 08:00:53 | probleme avec les «Fameux Sockets»!!!

ELCouz

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
http://www.qsc-news.com
vendredi 25 juillet 2008 à 14:43:23 | Re : probleme avec les «Fameux Sockets»!!!

Francky23012301

Membre Club
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+
vendredi 25 juillet 2008 à 20:22:25 | Re : probleme avec les «Fameux Sockets»!!!

ELCouz

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
http://www.qsc-news.com
vendredi 25 juillet 2008 à 21:34:12 | Re : probleme avec les «Fameux Sockets»!!!

Francky23012301

Membre Club
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


Cette discussion est classée dans : texte, socket, jai, pointer, tstringstream


Répondre à ce message

Sujets en rapport avec ce message

Envoie de texte Socket [ par aLTsn3ak3r ] SAlut , jai fait un serveur socket et jai esayé denvoyer deux trois ligne de texte kan kelkun se connecte mais , sa nenvoi ke une et jai essayé avec A Jai besoin daide!!! [ par PatSW ] J'aimerais savoir comment lire et écrire d'une application a une autre.Ex: Dans Project1.exe, un Memo contien le texte "Allo";je veux pouvoir lir ce t Socket data et connection[] [ par mickeydisn ] Voila Deux petit question.. tout d'abor quand pour utiliser le pointer socket.datapour un entier socket.data := pointer(i); Récupérer Un texte tapé et s'en servir [ par kisskool ] Salut à tous !Voila j'ai une petite question, je vais vous donner un exemple simple .Je veux que l'utilisateur du programme puisse taper le chemin d'a Filtre *texte_recherché* [ par nonobiker ] Bonjour,Je souhaite appliquer un filtre *texte_recherché* (n'importe où dans le champ) en utilisant la propriété Filter mais çà ne marche pas. Je n'ai serveur ftp avec routeur [ par grosbisou ] Bonjour, jai un routeur netgear et jai 4 PCs branchés dessus. qd jessaye de créer un domaine sur no-ip.com il mindique que mon adresse ip n'est pas va compare deux fichier texte [ par kinyo ] qui peut m'indiquer comment faire pour comparer deux fichiers texte et faire apparaitre ce qui a changermerci ouvrir un fichier texte [ par kwentinn ] salut tout le monde,je dois faire un petit prog sensé récupérer des infos à partir d'un fichier texte.Sur chaque ligne du fichier texte, il y a 6 cham recuperation de nombres separés par tabulations dans fichier texte [ par niko72 ] bonjour les amis de delphi,voila, j'ai une petite question toute bete dont je n'arrive pas à trouver la réponse:j'ai un fichier texte avec toutes les comptes outlook --> .txt [ par stef13009 ] jaurais besoin dun pti prog qui tire par exemple le chemin et le nom du fichier .wab outlook d'un fichier texte kelkonke que je creerais, et quil lise


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales