Moults questions diverses et intéressantes !!! [C++ sous unix] - Programmation
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
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 |
essaie avec l'option -static
Citation : Mais comment faire |
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 |
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 à |
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 :
|
Citation : 5/ Pour la saisie de chaînes de caractères avec espaces, je veux utiliser |
exemple de syntaxe getline:
Code :
|
Citation : 6/ Il m'arrive que 'cout' ne veuille pas m'afficher ce que je lui demande si je ne |
il faut parfois flusher le buffer pour forcer
l'ecriture (sur le disque, l'ecran etc..)
cout.flush();
A+
LeGreg
Marsh Posté le 12-08-2002 à 01:15:02
Citation : Mais comment faire |
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.
Marsh Posté le 12-08-2002 à 10:24:04
oliv5 a écrit a écrit :
|
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
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
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()..
|
C'est vrai que je suis pas très clair
J'ai pourtant essayé de l'être (au début)
++
Marsh Posté le 13-08-2002 à 19:37:05
startx25 a écrit a écrit : ? |
??
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 :
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 :
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