Bonjour,
Voilà je vous ai préparé quelques questions auxquelles j'ai essayé de trouver
une réponse, en vain. Je les numérote, il vous sera plus facile de m'y répondre.
Donc :
1/ J'utilise gcc pour compiler, et j'ajoute l'option '-lstdc++' pour dire au
programme de s'appuyer sur la librairie (actuellement
'libstdc++-3-libc6.2-2-2.10.0.so'.
Comment faire pour rendre l'exécutable autonaume ?
Autrement dit pour inclure ce fichier dans mon exécutable compilé ...
2/ Dans une application client serveur avec des sockets SOCK_STREAM (TCP),
lorsque l'on est un serveur, on attend une connexion d'un client, puis
lorsqu'on l'a on reçoit ce qu'il nous envoie. Classique. Mais comment faire
pour que ce serveur s'apperçoive lorsque la connexion avec le client a été
coupée (si le client s'est donc arrêté) ?
3/ Avec des sockets SOCK_DGRAM (TCP), la fonction recvfrom() est cencée être
blocante et donc le programme ne continuer que lorsque recvfrom() à reçu un
paquet. Or ça n'a pas l'air d'être le cas, il me dit 'Socket operation on
non-socket' avec la fonction perror(), et continue le reste du programme.
Voici le code :
Code :
- if ((taille = recvfrom(srv_cli_cnt, buff, 4096, 0, (struct sockaddr *)&son,
- &addr_len)) == -1)
- perror("Serveur : Erreur de réception " );
- else
- cout << buff << endl;
|
4/ L'utilisation de cin.width() est étrange. Imaginons que je fasse 2 appels à
'cin' consécutifs, le premier précédé de 'cin.width(15)' et le 2 eme aussi
(mais ça n'a pas d'importance).
Si j'exécute le programme et que je tape moins ou plus de 15 caractères, le 2
eme appel à cin est totalement ignoré, et la variable qui aurait du être
remplie ne change pas.
J'ai fait d'autres tests et permettez-moi de vous dire que le comportement de
cin.width() me paraît très aléatoire !
5/ Pour la saisie de chaînes de caractères avec espaces, je veux utiliser
cin.getline(), mais ça bug totalement !!!
Si je fais une simple saisie 'cin' en mettant des espaces, en fait il saisit le
premier mot et le stocke dans la variable et continue l'exécution du programme
(qui est une boucle), et lorsqu'il revient sur le 'cin' (vu que c'est une boucle)
il stocke le 2 eme mot sans me demander, et ainsi de suite.
Regardez ce code :
Code :
- while(strcmp(msg, "quit" ))
- {
- cin >> msg;
- o_cli->go(msg);
- }
|
Si je met la phrase 'salut les copains !!!' il exécute la fonction membre go avec
le paramètre "salut", puis la ré-exécute avec "les", puis "copains", puis "!!!".
De plus une chose étonnate, et que la fonction go affiche ce qu'elle reçoit en
ajoutant un saut de ligne. Dons si je lui envoie un mot elle l'affiche et va à la
ligne (avec cout << msg << endl. Mais si je lui envoie une phrase elle affiche
tous les mots collés les uns aux autres, et à la fin de la phrase le retour de
chariot.
Autrement dit si je met la phrase 'salut les copains !!!' go m'affiche
'salutlescopains!!!'.
Bizarre, vous avez dit bizarre.
A noter que si je tape 'salut', puis la flèche droite (il s'affiche à l'écran ^[[C)
au lieu des espaces, là ça fonctionne !!! Il affiche la phrase correctement.
Donc en entrée je met
salut^[[Cles^[[Ccopains^[[C!!!
et j'ai en sortie :
salut les copains !!!
6/ Il m'arrive que 'cout' ne veuille pas m'afficher ce que je lui demande si je ne
termine par un retour chariot. ça arrive pas toujours.
D'ailleurs ça me fait penser à la fonction printf() qui faisait pareil...
C'que c'est bizarre !!!
Je remercie déjà les personnes qui me donneront des solutions
@++
---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com