Bonjour,
voilà, je travaille sur une petite application client-serveur. La connection fonctionne à merveille, mais j'ai des problèmes dus au types de mes variables, voici le code problématique :
char * strMessage;
char *strIp;
..
..
..
void __fastcall TfrmServer::ObtenirIP() //Afin d'obtenir le ip du serveur.
{
struct sockaddr_in sin;
struct hostent * phe;
char FAR buffer[64] ;
// Initialisation du service WSA
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
// Récupération du nom de la machine
gethostname(buffer, sizeof(buffer));
// Récupération de la liste d'ips associées à la machine
phe = gethostbyname(buffer);
if(phe==NULL)
{
//cerr << "Erreur : pointeur nul";
WSACleanup();
system("PAUSE");
exit(1);
}
// Enumération des adresses
int I = 0 ;
while((phe->h_addr_list[I+1])!=NULL)
{
I++;
}
memcpy(&sin.sin_addr.s_addr, phe->h_addr_list[I], phe->h_length);
strIp = inet_ntoa(sin.sin_addr);
txtIP->Text=strIp;
WSACleanup();
}
Ensuite, dans une autre fonction, je veux envoyer un message au client :
....Fonction(..)
{
char *chrMess;
..
..
..
strMessage = "Vous êtes connectés à " ; //(1)
strcat(strMessage, strIp); //(2)
chrMess = "sur le port 300"; //(3)
strcat(strMessage, chrMess); //(4)
send(klist->sock,strMessage,SinDist.sin_port,0); //(5)
..
..
..
}
Bon, je vais faire la trace de cette partie de programme pour démontrer ce qui ce produit
(1) strMessage prend le texte. strMessage = Vous êtes connectés à
(2) La concaténation se fait, strMessage devient donc "Vous êtes connectés à ab.cde.fg.hij"
(3) chrMess ne prend pas la bonne valeur, il devient "b.cde.fg.hij"
(4) La concaténation fonctionne, strMessage devient donc "Vous êtes connectés à ab.cde.fg.hijb.cde.fg.hij" --- Le IP se répète mais en perdant le premier caractère!
(5) Le message reçu par le client est celui du #4.
Je crois comprendre que le problème vient du fait que lors de la première concaténation, les pointeurs sont mal géré et ce qui est stocké en mémoire est désordonné, ce pourquoi chrMess ne contient pas le texte que je lui ai donné..
Si quelqu'un avait une idée comment je pourrais concaténer les 3 chaines soit. StrMessage + strIP + chrMess comme il faut, je serais intéressé.
De plus, comme vous avez probablement constaté, le choix des types de variables est possiblement mal fait, vous pouvez me le dire, je suis ouvert aux commentaires. Aussi, si vous avez des sources qui pourrait m'aider à bien comprendre l'utilisation des différents types, j'apprécierais.
Concernant l'obtention du IP, celà provient d'une source prise sur ce site, et qui fonctionne. Ma question principale est donc pour ma concaténation. Le message envoyé devrait être
"Vous êtes connectés à ab.cde.fg.hij sur le port 300"
Merci de votre aide et de vos suggestions.