speed_t

speed_t - C - Programmation

Marsh Posté le 15-11-2006 à 14:55:48    

Bonjour,
Dans mon prog je cherche a recuperer les vitesses des terminaux via la fonction cfget(i ou o)speed qui renvoie un type speed_t d'une structure termios.
Cete fonction doit renvoyer un code du genre B0 ou B1200 ou B quelque chose qui est une vitesse de sortie ou d'entree du terminal.
Je cherche a afficher ce code sur stdout, j'ai essaye avec printf("%d" ),const speed_t vitesse) et plein d'autres rien y fait.
Evidement j'ai declare une var vitesse de type speed_t, une var terminal de struct termios et j'ai recupere.
Comment doit on s'y prendre un petit bout de code serai le bienvenu.
Merci.

Reply

Marsh Posté le 15-11-2006 à 14:55:48   

Reply

Marsh Posté le 15-11-2006 à 20:49:16    

Donne ton printf() et ce qu'il affiche pour voir ?

Message cité 1 fois
Message édité par matafan le 15-11-2006 à 20:49:29
Reply

Marsh Posté le 16-11-2006 à 15:37:01    

matafan a écrit :

Donne ton printf() et ce qu'il affiche pour voir ?


 
Bonjour,
Voici la potion de code:

Code :
  1. printf("\nRecuperation de la vitesse du terminal" );
  2. cgetattr(STDIN_FILENO,&terminal_out);
  3. speed_o=cfgetospeed(&terminal_out);
  4. printf("\nvitesse du terminal en out %d",speed_o);
  5. struct termios terminal_out;
  6. speed_t speed_o,speed_i;


le printf donne 16 avec %d et 10 avec %X

Reply

Marsh Posté le 16-11-2006 à 19:05:26    

Donc il n'y a pas de probleme... Chez moi 0x10 correspond a B19200. Les Bxxx, c'est des #define. cfgetospeed renvoie la valeur d'un de ces #defines.
 
Et puis aussi, met les \n en fin de chaine plutot qu'en debut, ca permettra de flusher la sortie correctement.

Reply

Marsh Posté le 17-11-2006 à 08:24:19    

Bonjour,
Ou trouves tu les #defines?

Reply

Marsh Posté le 17-11-2006 à 08:33:13    

yartempion a écrit :

Bonjour,
Ou trouves tu les #defines?


J'ai un autre pb voici un bout de code,

Code :
  1. SOUS_OPTION_NEGOCIEE(mess_nego11,socket11)
  2. {
  3. int i;
  4. unsigned char *terminal,*mess_nego13;
  5. struct termios terminal_out;
  6. speed_t speed_o,speed_i;
  7. mess_nego13=mess_nego11;
  8. printf("\nVerification de la sous option a negocier valeur de la SB %d",*(mess_nego13+2));
  9. switch (*(mess_nego13+2))
  10. {
  11. case 24:{
  12. /*Recuperation d'info sur le treminal*/
  13. printf("\nSous option Type de terminal actuel: %s",terminal=getenv("TERM" ));
  14. printf("\nsequence recue taille du message %d %d %d %d",*(mess_nego13+0),*(mess_nego13+1),*(mess_nego13+2),*(mess_nego13+3));
  15. printf("\navant for" );
  16. for(i=0;i<5;i++)
  17. printf("i=%d ",i);
  18. printf("\nfin du for" );
  19. }
  20. break;
  21. case 32:{
  22. printf("\nSous option Terminal speed" );
  23. printf("\nRecuperation de la vitesse du terminal" );
  24. tcgetattr(STDIN_FILENO,&terminal_out);
  25. speed_o=cfgetospeed(&terminal_out);
  26. printf("\vitesse du terminal en out %d",speed_o);
  27. }
  28. break;
  29. case 33: printf("\nSous option LFLOW" );
  30. break;
  31. case 36: printf("\nSous option environnement" );
  32. break;
  33. default: printf("\nSous option non negociee" );
  34. break;
  35. }
  36. }


dans le case 24 j'ai rajoute un for depuis impossible de breaker le switch pour en sortir ou l'erreur.


Message édité par yartempion le 17-11-2006 à 08:36:23
Reply

Marsh Posté le 17-11-2006 à 08:57:20    

Pour  le Pb dans le switch case 24 tout est Ok.
Par contre je suis toujours interesse pour les define.

Reply

Marsh Posté le 17-11-2006 à 09:07:23    

yartempion a écrit :

Bonjour,
Ou trouves tu les #defines?


Euh, genre dans la doc...
 
http://man.he.net/man2/tcgetattr
http://man.developpez.com/man3/tcgetattr.3.php


Message édité par Emmanuel Delahaye le 17-11-2006 à 09:10:50

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-11-2006 à 11:44:25    

Pourriez vous me donner la correspondance entre Bxx et le code renvoye.
B0=
B50=
B75=
B
 
 
 
B19200=16
etc,etc
Merci.

Reply

Marsh Posté le 17-11-2006 à 11:58:49    

Ben affiche-les, ce sont des constantes POSIX.1 définies dans termios.h [:mlc]
 
Emmanuel t'a donné les liens en plus, donc t'as pas dû les lire.
 
Et comme je suis trop con gentil, regarde (chez moi) :
 

$ cat test.c                        
#include <stdio.h>
#include <termios.h>
 
int main(void)
{
   printf("%d\n", B9600);
   
   return 0;
}
$ gcc -pedantic -W -Wall -O2 test.c
$ a.out
13
$  


 
 
edit : ceci dit, puisque tu as les constantes de définies, tu ne devrais pas avoir à te préoccuper de leur valeur...

Message cité 1 fois
Message édité par Elmoricq le 17-11-2006 à 12:02:59
Reply

Marsh Posté le 17-11-2006 à 11:58:49   

Reply

Marsh Posté le 17-11-2006 à 12:01:28    

yartempion a écrit :

Pourriez vous me donner la correspondance entre Bxx et le code renvoye.
B0=
B50=
B75=
B
 
B19200=16
etc,etc


Ca ne sert à rien. Tu fais un switch-case et c'est reglé (le nom des constantes est suffisamment explicite, non ?). Tu n'a pas besoin de connaitre les valeurs exactes. Il faut apprendre à travailler en abstraction...

Code :
  1. switch (champ_debit)
  2.    {
  3.    case B50:
  4.       bauds = 50;
  5.       break;

etc.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-11-2006 à 12:02:38    

Elmoricq a écrit :


ceci dit, puisque tu as les constantes de définies, tu ne devrais pas avoir à te préoccuper de leur valeur...


+1


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-11-2006 à 14:22:42    

(je précise juste pour appuyer le fait qu'il faille utiliser les constantes, que sur mon serveur, B19200 vaut 14 [:petrus75] )

Reply

Marsh Posté le 28-11-2006 à 20:05:27    

Bonjour,
Si je veux communiquer la vitesse de mon terminal a un distant sur un seul octet est ce que je lui envoie la valeur retour de cfgetspeed().

Reply

Marsh Posté le 28-11-2006 à 20:17:24    

yartempion a écrit :

Bonjour,
Si je veux communiquer la vitesse de mon terminal a un distant sur un seul octet est ce que je lui envoie la valeur retour de cfgetspeed().


Non. Il faut définir une convention 'réseau' indépendante de toute implémentation


enum
{
   ...,
   NET_BDS_9600 = 4,
   ...,
};


et faire la conversion dans les deux sens :

 
  • En émission : système -> reseau
  • En reception : réseau  -> système


Par exemple :

 

Sys A : emission


switch (sys_bds)
{
case B9600:
   net_bds = NET_BDS_9600;
   break;
etc.

 

Sys B : récéption


switch (net_bds)
{
case NET_BDS_9600:
   sys_bds = B9600;
   break;
etc.

 

C'est la seule façon d'être indépendant.
 
Mais quand est-ce qu'on va se décider à enseigner la conception en informatique...


Message édité par Emmanuel Delahaye le 28-11-2006 à 20:22:17

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-11-2006 à 08:00:29    

Bonjour,
Dans la rfc 1079 concernant la transmition des vitess du terminal comment est transmise la valeur de la vitesse du terminal.
Mon probleme c'est que j'ai ecris un client telnet qui se connecte a certain equipement mais pas a d'autre.
Par exemple j'arrive a ouvrir une connection sur un routeur cisco, nortel etc  mais pas sur un serveur unix ou certain autres routeurs.
Ils sont en attente de reponse d'options a negocier.

Reply

Marsh Posté le 29-11-2006 à 10:15:04    

yartempion a écrit :

Dans la rfc 1079 concernant la transmition des vitess du terminal comment est transmise la valeur de la vitesse du terminal.
Mon probleme c'est que j'ai ecris un client telnet qui se connecte a certain equipement mais pas a d'autre.
Par exemple j'arrive a ouvrir une connection sur un routeur cisco, nortel etc  mais pas sur un serveur unix ou certain autres routeurs.
Ils sont en attente de reponse d'options a negocier.


La RFC 1079 concerne l'échange d'information entre terminaux Telnet sous X/Window (Motif, X11 etc.). Tu te sens concerné ?

 

Je vais essayer de comprendre ce que tu veux faire.

 
  • Tu veux écrire un client Telnet. OK
  • Celui-ci se connecte à certains équipement et pas à d'autres. OK


Ton problème est donc de savoir pourquoi.

 

Telnet est un protocole qui régit l'échange d'informations entre 2 équipements. Un serveur et un client. Il est spécifié par la RFC 854.

 

http://www.ietf.org/rfc/rfc0854.txt
 
Pour que ton client ait la moindre chance de se connecter à un serveur Telnet quelconque, il doit absolument supporter l'ensemble de ces dispositions. Si ce n'est pas le cas, ça ne fonctionnera pas dans tous les cas (ca peut fonctionner sur certains serveurs simplifiés).

 

C'est probablement pour ça que la connexion ne s'établit pas sur certains serveurs.

 

Il ne reste plus qu'à implémenter le protocole coté client.


Message édité par Emmanuel Delahaye le 29-11-2006 à 10:17:19

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-11-2006 à 09:38:09    

Bonjour,
Ca y'est j'ai compris comment ca se passe.
On envoie reellement la vitesse du terminal sous forme de caracteres ascii tout simplement a charge au distant de l'interpreter.
Exp: IAC SB TERMINAL-SPEED IS "1200,1200" IAC SE
on ecrit sur la socket sous forme de caractere ascii avec le caracter ascii (,) virgule comme separateur entre la vitesse Tx et Rx mais doit on transmetre les double cotes ou pas
 

Reply

Marsh Posté le 30-11-2006 à 12:08:20    

yartempion a écrit :

Ca y'est j'ai compris comment ca se passe.
On envoie reellement la vitesse du terminal sous forme de caracteres ascii tout simplement a charge au distant de l'interpreter.


Ben oui, par exemple.

Citation :

Il faut définir une convention 'réseau' indépendante de toute implémentation


 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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