envoi / reception d'objets avec ICS - Delphi/Pascal - Programmation
Marsh Posté le 02-01-2006 à 15:24:55
Je suis pas sûr de comprendre... tu envoies un pointeur par le réseau et tu espères que de l'autre côté tu pourras accéder aux données de l'expéditeur via ce pointeur ?
Marsh Posté le 02-01-2006 à 15:29:47
C'est les fonctions "Send" et "Receive" qui font le travail
Elles copient le contenu du pointeur pour l'envoyer ensuite !
Marsh Posté le 02-01-2006 à 15:53:30
Ça me semble étrange, vu qu'elle ne peuvent pas deviner la taille des données qui sont derrière (ou alors il y a un truc qui m'échappe, mais bon, si tu passes un pointeur non typé ça devient juste un entier contenant une adresse, celui qui le reçoit ne sais plus à quoi ça correspond).
Mais soit, même en admettant que ce soit possible, la variable de type "string" est elle même un pointeur. Et là ça coince de toute façon, même si le contenu de l'objet est copié.
Marsh Posté le 02-01-2006 à 15:55:55
Et en plus:
Buffer^ := Perso;
buffer est non initialisé et tu dis de mettre une copie du pointeur de perso à l'adresse pointée par Buffer... ça explose d'office.
à la limite tu mettrais
Buffer := @Perso;
ça serait plus logique
(et sizeof de Buffer, ça donne 4, la taille d'un pointeur, non ?)
Marsh Posté le 02-01-2006 à 15:59:05
Oui y avait bien un 1er pbm avec la taille envoyée / reçue qui ne devait pas être celle du pointeur mais celle de l'objet...
ensuite le "string" j'ai mis ça a la va-vite pour l'exemple, sinon c'est une string[11] qui est envoyée.
Et j'ai résolu mon problème en utilisant des Record au lieu des objets.
merci quand même !
Adrien
Marsh Posté le 02-01-2006 à 17:44:25
bah oui avec des record et des ShortString ça marche tout de suite mieux
Marsh Posté le 02-01-2006 à 18:10:44
Tu connais ICS ? parce que j'ai des pbms par contre pour envoyer du serveur vers le client... je vois pas ce qu'il y a de spécial à savoir pour faire ça ! (en UDP)
Byouuu
Marsh Posté le 02-01-2006 à 20:09:54
Non, là désolé je peux pas t'aider, je n'ai utilisé qu'Indy (et encore, juste pour du HTTP) et les composants Socket fournis avec Delphi.
Marsh Posté le 31-12-2005 à 11:40:52
Bonjour,
j'ai maintenant bien compris le fonctionnement (assez simple il faut l'avouer) de Send et Receive (de la librairie ICS), après avoir relu quelques tutos sur les pointeurs
J'arrive donc à envoyer tous les types de données simples, mais pas des types de ma création... du moins ça marchait avant, et je ne sais pas ce que j'ai changé et ça ne fonctionne plus ! Je pense que l'erreur se trouve dans le calcul du Buffer envoyé / reçu...
petit exemple :
-------------------------
TPerso = class
nom : string;
age : integer;
[...]
procedure envoi de données : // dans le client
var Buffer : ^TPerso
begin
Perso := TPerso.Create;
Perso.nom := 'toto';
Perso.age := 13;
Buffer^ := Perso;
SerSocket.Send(Buffer, SizeOf(Buffer));
procedure qui reçoi les données : // dans le serveur
var Buffer : ^TPerso
Socket.Receive(Buffer, SizeOf(Buffer));
ShowMessage(Buffer^.name); // erreur....
-------------------------------------------------
bien sur j'ai pris soin de faire les new(buffer) et dispose(buffer), ainsi que de détruire les objets après utilisation. J'obtiens a l'exécution des exception "Access Violation" côté serveur, dès que je tente d'accéder a un paramètre de l'objet.
J'ai essayé de spécifier Taille Du Buffer = Taille de l'objet + taille des paramètres mais ça ne marche pas mieux...
Delphicalement...
Adrien