[C++ sous unix] Moults questions diverses et intéressantes !!!

Moults questions diverses et intéressantes !!! [C++ sous unix] - Programmation

Marsh Posté le 11-08-2002 à 10:50:34    

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 :
  1. if ((taille = recvfrom(srv_cli_cnt, buff, 4096, 0, (struct sockaddr *)&son,
  2. &addr_len)) == -1)
  3. perror("Serveur : Erreur de réception " );
  4. else
  5. 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 :
  1. while(strcmp(msg, "quit" ))
  2. {
  3. cin >> msg;
  4. o_cli->go(msg);
  5. }


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
Reply

Marsh Posté le 11-08-2002 à 10:50:34   

Reply

Marsh Posté le 11-08-2002 à 11:26:13    

while(strcmp(msg, "quit" ))
   {
     cin >> msg;
     o_cli->go(msg);
   }
   
 
 
pour ca c'est tout a fait normal, apske quand tu fais
 
cin >> nombre1 >> nombre2 ;
 
ca te permet de taper 2 nombres séparés par des espaces
 
 
 
pour le reste de tes pb, je sias pas, pask'il faudrait ke je compile pour voir exactement quels problemes isl sont, et j'ai la flemme :D

Reply

Marsh Posté le 11-08-2002 à 13:54:15    

Citation :

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é ...


 
essaie avec l'option -static
 

Citation :

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é) ?


 
avec un timeout par exemple si le client ne coupe pas la connexion proprement.
 

Citation :

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.


 
Elle n'est blocante que s'il n'y a pas d'erreur d'execution,
ce qui n'est pas le cas ici. Difficile d'en dire plus avec juste l'extrait de programme que tu as fourni.
 

Citation :

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 !


 
ton explication n'est pas tres clair..
qu'appelles tu "le deuxieme appel a cin" ?
cin.width() sert a limiter le nombre de caractere lus sur l'entrée standard.
exemple:

Code :
  1. char s[21];
  2. cin.width(20);
  3. cin >> s;


 

Citation :

5/ Pour la saisie de chaînes de caractères avec espaces, je veux utiliser
cin.getline(), mais ça bug totalement !!!


 
exemple de syntaxe getline:
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main() {
  5.    string machaine;
  6.    getline(cin, machaine);
  7.    cout << machaine;
  8.    return 0;
  9. }


 

Citation :

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 !!!


 
il faut parfois flusher le buffer pour forcer
l'ecriture (sur le disque, l'ecran etc..)
cout.flush();  
 
A+
LeGreg


Message édité par LeGreg le 11-08-2002 à 13:55:30
Reply

Marsh Posté le 12-08-2002 à 01:15:02    

Citation :

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é) ?


 
C'est du TCP ? donc en mode connécté, donc il y a tout un tas de mécanismes qui gèrent la connexion. En cas d'arret pas propre du client (plantage), le serveur sera au courant de la déconnexion.
 
Inutile d'utiliser un timer, c'est valable uniquemement en UDP cad mode non connecté. Là, le serveur ne sait pas si il y a qqu'un au bout du fil. Les mecanismes de connexion, dont je parlais, sont alors absents donc ca va plus vite, d'ou l'utilisation dans le jeux du mode UDP.

Reply

Marsh Posté le 12-08-2002 à 10:24:04    

oliv5 a écrit a écrit :

Citation :

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é) ?


 
C'est du TCP ? donc en mode connécté, donc il y a tout un tas de mécanismes qui gèrent la connexion. En cas d'arret pas propre du client (plantage), le serveur sera au courant de la déconnexion.
 
Inutile d'utiliser un timer, c'est valable uniquemement en UDP cad mode non connecté. Là, le serveur ne sait pas si il y a qqu'un au bout du fil. Les mecanismes de connexion, dont je parlais, sont alors absents donc ca va plus vite, d'ou l'utilisation dans le jeux du mode UDP.




 
Salut,
 
en effet je parlais des SOCK_STREAM, mais en fait j'ai fait une boucle infinie (enfin qui se termine avec réception du mot "quit" ou "quit\n" ) et donc il me faudrait un signal pour terminer la boucle si le client quitte sans envoyer le mot "quit".
Parceque même si le serveur SOCk_STREAM s'en apperçoit, comme tu dis, la boucle continue quand même.
 
La syntaxe de getline que l'on m'a donné n'est pas bonne ;)
Je me suis renseigné et mis la bonne syntaxe, mais ça marche pas :(
 
Merci :jap:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-08-2002 à 12:22:10    

exemple avec read:
fd est un socket,
si read(fd, resultat, taille_max) == 0
alors c'est la fin du flux..
 
Sinon si tu utilises la syntaxe C++ bufferisée
relis ton manuel sur les basic_istream, basic_ios
notamment la fonction eof()..
 

Citation :

La syntaxe de getline que l'on m'a donné n'est pas bonne ;) Je me suis renseigné et mis la bonne syntaxe, mais ça marche pas :(


 
Qu'est-ce qui ne marche pas?
c'est pas tres clair..
 
A+
LeGreg

Reply

Marsh Posté le 12-08-2002 à 21:19:25    

legreg a écrit a écrit :

exemple avec read:
fd est un socket,
si read(fd, resultat, taille_max) == 0
alors c'est la fin du flux..
 
Sinon si tu utilises la syntaxe C++ bufferisée
relis ton manuel sur les basic_istream, basic_ios
notamment la fonction eof()..
 

Citation :

La syntaxe de getline que l'on m'a donné n'est pas bonne ;) Je me suis renseigné et mis la bonne syntaxe, mais ça marche pas :(


 
Qu'est-ce qui ne marche pas?
c'est pas tres clair..
 
A+
LeGreg




 
C'est vrai que je suis pas très clair :(
J'ai pourtant essayé de l'être (au début) ;)
 
++


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 13-08-2002 à 09:14:03    

?

Reply

Marsh Posté le 13-08-2002 à 19:37:05    

startx25 a écrit a écrit :

?




??


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed