Comment envoyer et récupérer une AnsiString (SendBuf inside)? [Borland] - C++ - Programmation
Marsh Posté le 10-12-2003 à 17:25:15
buffer=new char[length];
buffer=BOUH.c_str();
en plus de faire 36 sujets pour le même problème, t'es un comique toi...
edit:
ce qui n'empeche que l'on peut utiliser c_str() directement, mais préférentiellement data() & size()
enfin personnellement, je serais curieux de savoir si ton truc compile.
SendBuf(&buffer, length)
j'y crois très peu
ReceiveBuf(&BOUH,Socket->ReceiveLength());
encore moins ... si tu commençais d'abord par te conformer aux prototypes, t'éviterais quelques écueils.
et utilise des size_t et pas des int
Marsh Posté le 10-12-2003 à 17:35:35
hein ?
g pas tout compris la! tu peu développer?
on peut pas déclarer un tableau de caractère et lui fournir une chaine après ?
Marsh Posté le 10-12-2003 à 17:38:36
si mais si t'appliques pas les bases qu'on t'as enseigné, à savoir ta copie std::copy ...
toute façon pour l'envoie, cette étape est inutile
send(const char*, size_t);
send(s.data(), s.size());
doit passer sans problème.
Marsh Posté le 10-12-2003 à 17:46:15
Bon déja: on m'a jamais enseigné std::copy , donc on va faire plus simple:
As tu une solution pour envoyer une structure (avec SendBuf), qui contient 1 entier, et 2 AnsiString ?
Ou alors, la solution de rechange, sais tu comment convertir une chaine de caractère en AnsiString ?
Merci de ton aide, mais je ne suis pas un 'comique'
Marsh Posté le 10-12-2003 à 17:53:02
si t'es un comique. comme dit dernièrement, faut établir un protocole, à savoir comment sont structurée les données qui sont envoyées pour savoir comment les récptionner. quand la donnée est de taille variable, on envoie d'abord la taille, puis les données.
Marsh Posté le 10-12-2003 à 17:55:21
et si tu comprends rien ben tant pis
Code :
|
et la tu balance en E/S binaire classique à la C
Marsh Posté le 10-12-2003 à 17:59:29
Taz a écrit : si t'es un comique. comme dit dernièrement, faut établir un protocole, à savoir comment sont structurée les données qui sont envoyées pour savoir comment les récptionner. quand la donnée est de taille variable, on envoie d'abord la taille, puis les données. |
justement, mon problème se situe ici, si j'ai plusieurs client et que le premier m'envoie une taille et le second client m'envoie son message juste derrière ben ca va foirer non ?
il faudrait que j'envoie la taille et les données en une fois ou bien il y a une subtilité que je n'ai pas comprise.
la tu me propose de faire 2 sendbuf, 1 avec la taille et lautre avec la structure, non ?
Marsh Posté le 10-12-2003 à 18:00:27
ben c'est sur que si tout le monde écrie sur le même socket ... faut des sockets privés, un par connexion
Marsh Posté le 10-12-2003 à 18:02:13
dans ce cas ma question vas te paraitre très stupide mais : on fait ca comment des sockets privés ?
Marsh Posté le 10-12-2003 à 18:04:03
avec la documentation de ce compilateur que tu as payé.
sinon tu ferais bien de réviser tes pointeurs en attendant
Marsh Posté le 10-12-2003 à 18:06:00
dans C++Builder avec le TServerSocket t'as un socket par client connecté (y a une des propriétés qui est une liste de sockets normalement)
Marsh Posté le 10-12-2003 à 18:11:07
ok merci, je vais creuser mais bon ça modifie complètement ce que je voulait faire
enfin une bonne partie tt du moins
Marsh Posté le 10-12-2003 à 21:43:10
bon j'essaye de refaire ce que j'avais réussi a faire tourner jusqu'à ce que avec mon binome on foute tout en l'air cet aprem.
j'essaye de passer des taille avec des size_t comme taz me l'as conseillé mais horreur, alors que tout compile et "fonctionne" j'ai une erreur en fermant l'appli serveur.
je l'ai isolée et voila ce que ça donne:
(variable globale: size_t length=0;
struct message
{ int Action;
AnsiString Pseudo;
AnsiString Texte;
};
struct message Msg;
)
Code :
|
Marsh Posté le 10-12-2003 à 22:10:03
Citation : |
char[length] -> tableau de 0 à length-1
buffer[length]=... -> dépassement de tableau
buffer=0; -> mettre à 0 le pointeur
delete buffer; -> delete de 0, ça ne fait rien
la mémoire n'est toujours pas vidée
Et t'as 2 new pour un delete... spa du java hein
Marsh Posté le 10-12-2003 à 22:10:17
buffer=new char[length];
buffer=Msg.Pseudo.c_str();
buffer[length]=0;
fortune
Marsh Posté le 10-12-2003 à 22:11:29
cf edit, la seconde est encore mieux pour une fortune
Marsh Posté le 10-12-2003 à 22:14:44
bon je comprends pas trop la blague mais bon sinon j'ai résolu le problème, c'est pas:
buffer[length]=0;
mais
buffer[length-1]=0; ben vi sinon c'est hors limites
EDIT grilled le temps de reboot now je passe pour un méga abruti spa cool
Marsh Posté le 10-12-2003 à 22:15:31
bah oui
et lis aussi ma remarque sur ton delete
Marsh Posté le 10-12-2003 à 22:17:04
Mais note que :
Code :
|
revient au même que :
Code :
|
Et que ton =0 ne sert strictement à rien vu que le c_str() te donne déjà une chaîne finie par 0
Marsh Posté le 10-12-2003 à 22:17:14
je veux bien qu'on critique mais si c pour se moquer sans me dire comment faire pour corriger, sachant que borland est en anglais chez moi, y a des subtilités de l'aide que je capte pas.
le delete je m'en doutais un peu mais alors je fait quoi?
2 variables buffer différentes ?
Marsh Posté le 10-12-2003 à 22:17:51
en relisant ton truc je vois un truc que j'avais pas vu : tu assignes un truc à buffer (new char) puis tu assignes un autre truc : non seulement la mémoire allouée est perdue et inutile, mais en plus un delete de buffer va tout crasher
Taz, je comprends ta douleur
Marsh Posté le 10-12-2003 à 22:18:54
Ou alors passe à Delphi, là au moins pour faire des bêtises avec les chaînes il faut vraiment le vouloir
Marsh Posté le 10-12-2003 à 22:19:41
antp a écrit : Mais note que :
|
oui c plus élégant forcément. merci
pour le c_str, je n'était pas sur qu'il complète avec le 0 mais j'avais compris qu'il "réservait" length+1 d'où buffer[length-1]=0; "pour etre sur"
Marsh Posté le 10-12-2003 à 22:21:25
Taz a écrit : tu veux pas apprendre le C++ et les pointeurs ? |
tu pense a quoi
mon exemple avec AnsiString BOUH; //une honte je sais
Marsh Posté le 10-12-2003 à 22:21:27
jeoff a écrit : |
1) faut te dire les trucs 2 fois
2) arrête tu t'enfonces. la couche réseau ny 'est pour rien, t'es une catastrophe
Marsh Posté le 10-12-2003 à 22:27:15
Taz a écrit : |
1)j'ai jamais dit que j'étais bon.
2)Tu as l'air plutot balaise en prog mais question pédagogie
3)J'apprécie tout de même ton aide quoique dès fois peu "constructive" parce que
buffer=new char[length];
buffer=Msg.Pseudo.c_str();
buffer[length]=0;
fortune
moi ca me parle pas.
4)sans rancunes
Marsh Posté le 10-12-2003 à 22:31:19
en fait, j'ai pas envie d'expliquer le réseau ou des trucs un peu avancé à quelqu'un qui connait pas son B-A BA, le cas échéant les pointeurs
Marsh Posté le 10-12-2003 à 22:48:16
Taz a écrit : en fait, j'ai pas envie d'expliquer le réseau ou des trucs un peu avancé à quelqu'un qui connait pas son B-A BA, le cas échéant les pointeurs |
c'est exact, merci de m'avoir conseiller de faire un tour a ce chapitre.
jusqu'à présent pour moi, delete supprimait la variable alors que non en fait elle désalloue l'espace réservé en mémoire mais la variable existe toujours donc si j'avais voulu écrire mon code proprement j'aurai du écrire :
Code :
|
finalement j'ai opté pour la solution de antp qui est beaucoup plus propre :
Code :
|
j'ai pas trop écrit de conneries là ?
Si c'est potable, merci de m'avoir fait revenir dans le droit chemin.
Marsh Posté le 10-12-2003 à 22:54:34
antp a écrit :
|
erf g mal compris l'exemple du bouquin ca aide pas... j'edite le delete ci dessus
Marsh Posté le 10-12-2003 à 22:56:16
heu t'as pas viré le buffer=0 et delete buffer dans ta "nouvelle" solution
les problèmes de ta 1e solution :
- tu assignes le résultat d'un new à ton buffer, ok, mais ensuite tu assignes le c_str à ce même buffer -> une chaîne C ça ne se copie pas avec un =, et vu que juste au dessus l'assignation avait la même tronche t'aurais dû te douter de qqchose
- il faut un delete pour chaque new (mais pas foutre deux new puis deux delete hein )
- si tu mets un pointeur à 0 il ne pointe plus vers rien, du coup le delete qui suit ne trouvera pas la zone à libérer
Marsh Posté le 10-12-2003 à 22:59:45
oui je viens de voir ca
EDIT j'ai mal compris, le buffer=0; dans mon bouquin ils conseillent de le mettre après le delete et pas AVANT comme je l'ai fait pour pas supprimer le contenu d'un pointeur vide par erreur
Marsh Posté le 10-12-2003 à 23:20:21
ReplyMarsh Posté le 10-12-2003 à 23:53:45
jai pas d'erreurs d'éxécution ca compile et tout et tout alors que ca compile c'est une chose mais ca veut pas dire qu'il n'y a pas de problème derrière...
c'est quoi le problème parceque si tu a une remarque sur un truc ca m'intéresse mais je vois pas où (au risque de passer pour un gros boulay).
Marsh Posté le 15-12-2003 à 00:47:28
buffer=Msg.Pseudo.c_str();
>> buffer est déclaré en char*, std::string::c_str() renvoit un const char*, on a perdu l'information de const : on ne doit pas modifier le contenu, en plus c'est la string qui s'occupe de son allocation et de sa 'libération'.
Marsh Posté le 10-12-2003 à 17:23:39
Voila je suis toujours sur mon appli de chat mais je n'arrive pas a envoyer une chaine de char qui est a la base une ansistring dans une structure.
voila les différentes portions de code, pas d'erreur a la compil mais erreur à l'éxécution.
variable globale : AnsiString BOUH="";//présente coté client et coté serveur
CLIENT:
reception de texte par le client
emission de texte par le client
SERVEUR :
emission sur acceptation de la connection
reception d'un message
Message édité par jeoff le 10-12-2003 à 17:25:17