2010-07-15 5 views
0

Dans Indy lorsque nous envoyons des chaînes au serveur, elles changent et apparaissent dans un nouveau format. par exemple j'ai essayé d'envoyer un fichier binaire (FILE.EXE) avec commande « WriteLn » dans indy:Envoyer des chaînes spéciales avec "WriteLn" dans "Indy" (Delphi)

Ms.LoadFromFile(FileAddress); 

    Ms.Read(B, Chunk); 

    for j := low(B) to high(B) do 
    begin 
     Part := Part + chr(B[j]); 
    end; 

et pour les chaînes d'envoi:

FileClient.IOHandler.WriteLn(Part); 

lorsque le client envoyait des chaînes sur le serveur, Je surveillais le clinet avec un renifleur. et enfin je suis arrivé ce résultat:

MZ?.........yy..,[email protected],.....o..?.I!,.LI!This program cannot be run in DOS mode....$.. 

Comme vous le voyez il y a des personnages qui ne sont pas dans leur véritable format plus et ils ont changé de « ? » personnage . mais il convient de noter que le sniffer a automatiquement changé une chaîne à "." , par exemple un de ces points (".") est chr (0) ou chr (5) peut-être !!

mais le renifleur n'a pas pu changer certains caractères en "." et nous les voyons dans "?" format. par exemple ouvrir un fichier binaire avec le bloc-notes et vous pouvez voir le véritable format:

alt text http://up.iranblog.com/Files/9f195012dbc2425b8773.png Quoi qu'il en soit, la question est: comment puis-je envoyer un fichier binaire avec la commande « WriteLn » dans Indy 10?

+0

Quelle version de Delphi? Si D2009 + vous regardez l'interprétation de vos chaînes comme étant Unicode où 1 char ne correspond pas à 1 octet. –

Répondre

13

@Kermia, la procédure WriteLn est conçue pour envoyer des données texte non binaires, ajoute également un CRLF à la fin de chaque mesagge envoyé.

Vous pouvez utiliser la procédure WriteStream ou Write pour envoyer des données binaires. Si vous insistez sur l'utilisation de la procédure WriteLn, vous devez encoder les données binaires avant d'envoyer en utilisant un Binary-to-text encoding comme Base64, et après décodage côté serveur.

+1

D'accord, d'autant plus que les données proviennent d'un TStream pour commencer. Indy a également une méthode WriteFile() disponible, qui ouvre un fichier et vide ses octets tels quels dans le socket. –

Questions connexes