IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

printf d'un serveur TELNET


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut printf d'un serveur TELNET
    Bonjour,

    Je voudrais faire un serveur Telnet sur un µControlleur :

    Voici ce que j'ai commencé à faire :

    ma lib telnet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #define TELNET_MAXSIZE_BUFF (100) // taille buffer Telnet
     
    struct _TELNET_struct{
    	TCP_SOCKET socket;					// socket
    	char buffer[TELNET_MAXSIZE_BUFF];	// buffer de stockage
    	void (*callFunc)(void);				// fonction suivante à lancer
    } TELNET_struct telnet;
     
     
    // initialisation de l'instance Telnet
    void Telnet_Init(void){
    	telnet.socket = INVALID_SOCKET; // socket
    	telnet.buffer[0]='\0'; // buffer de stockage
    	telnet.callFunc= Telnet_openSocket; // prochaine fonction à executer
    }
     
    // processus Telnet Principal
    void TelnetTask(void){
    	telnet.callFunc();
    }
     
     
    //***************************
    // ouverture du socket
    void Telnet_openSocket(void){
    	if(telnet.socket != INVALID_SOCKET){
    		telnet.socket = TCPOpen(0, TCP_OPEN_SERVER, TELNET_PORT, TCP_PURPOSE_TELNET);
    		if(telnet.socket == INVALID_SOCKET)
    			return;
     
    		telnet.callFunc = Telnet_promptLoggin;
    	}
    }
     
    //***************************
    // récupération du Loggin
    void Telnet_promptLoggin(void){
    	if(telnet.socket != INVALID_SOCKET){
     
    		TELNET_printf("Salut les gas\n");
    		TELNET_printf("Bienvenu chez moi\n");
    		TELNET_printf("Loggin : ");
     
    		TELNET_scanln(); // recupère une ligne (le contenu est mis dans telnet.buffer)
     
    		telnet.callFunc = Telnet_promptPassword;
    	}
    }
     
     
    // récupération du Password
    void Telnet_promptPassword(void){
    ...
    }
     
     
    // écrit chaine de caractère
    void TELNET_printf(char *str, ...){
     
    	fprintf(telnet.buffer, *str);
     
    	// vérifie qu'on peut écrire sur le port
    	if(TCPIsPutReady(telnet.socket) < strlen(telnet.buffer))
    		return;
     
    	TCPPutString(telnet.socket, str);
    }
    utilisation de ma lib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Telnet_Init();
    while(1){
    	TelnetTask();
    }
    Je ne vois pas comment faire pour gérer ma fonction TELNET_printf() car si la fonction TCPIsPutReady indique que le buffer d'émission n'est pas disponible alors l'envoie est annulé => je ne vois pas comment faire pour relancer la fonction avant de passer au TELNET_printf() suivant.

    Vous avez une idée ?

    merci d'avance,

    Remarque : bien entendu je dois aussi faire la fonction TELNET_scanf()

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien au pire, tu dois pouvoir faire une boucle d'attente active ou semi-active, non?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Désolé je ne comprends pas ce que tu veux dire (j'ai regardé la définition de Attente active mais je ne vois pas comment je dois faire...)

    Tu pourrais m'en dire plus stp ?

    Remarque : j'aimerais que ma fonction Telnet_promptLoggin() soit peu/pas modifiée => j'aimerais éviter au maximum les contrôles d'avancement du processus pour simplifier l'utilisation de ma lib


    voici ce que j'aimerais éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    // ***************************
    // affichage du prompt Loggin
    void Telnet_promptLoggin(void){
    	static char sm = 0; // pour la machine d'état
     
    	if(telnet.socket != INVALID_SOCKET){
     
    		switch(sm){
    			case 0:
    				if(TCPIsPutReady(telnet.socket) < 13)
    					break;
     
    				TELNET_printf("Salut les gas\n");
    				sm++;
     
    			case 1:
    				if(TCPIsPutReady(telnet.socket) < 18)
    					break;
     
    				TELNET_printf("Bienvenu chez moi\n");
    				sm++;
     
    			case 2:
    				if(TCPIsPutReady(telnet.socket) < 9)
    					break;
     
    				TELNET_printf("Loggin : ");
    				sm++;
     
    			case 3:
    				if(!TELNET_scanln())
    					break;
     
    				sm++;
     
    			default:
    				sm = 0; // retour à la première étape	
    				telnet.callFunc = Telnet_promptPassword; // passage à la fonction suivante				
    		}
     
    	}
    }
     
     
     
    // écrit chaine de caractère
    void TELNET_printf(char *str, ...){
    	TCPPutString(telnet.socket, str);
    }
    => c'est super lourd à utiliser, pour chaque TELNET_printf il faut faire des tests : mais peut être qu'on est obligé de faire comme ça ???
    En plus le problème avec cette méthode est que ça fonction bien si la chaine à envoyer est statique mais si elle est dynamique à chaque re-appele de la fonction TELNET_printf, il faudra recalculer la chaine (ex : TCPPutString("salut %d", toto)) => je ne suis pas sure de m'etre fait comprendre...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je voulais dire remplacer ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	// vérifie qu'on peut écrire sur le port
    	if(TCPIsPutReady(telnet.socket) < strlen(telnet.buffer))
    		return;
    par quelque chose ressemblant à ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	// vérifie qu'on peut écrire sur le port
    	while(TCPIsPutReady(telnet.socket) < strlen(telnet.buffer)) {}
    (ou une variante qui contiendrait un usleep() ou un truc du genre)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Oui c'est "peut-être" une bonne idée mais le problème est que cette méthode est bloquante. Or si TCPIsPutReady(telnet.socket) n'est pas bon, il faut que je retourne dans mon main (ça appelle la lib qui s'occupe de l'envoie des données => vide le buffer d'émission).

    Donc je suppose qu'il faut faire une gestion de thread mais je ne sais pas trop comment faire (vu que je suis sur un µControlleur sans OS il faut que je gère tout moi même) : comment on gère t-on les threads sans lib externe ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À cette échelle, tu pourrais te contenter de gestion de fibres à la place (un multitâche coopératif à la Win 3.11).

    Il suffit d'avoir une seconde pile pour la nouvelle fibre et un endroit où sauvegarder les anciens pointeurs d'instruction et de sommet de pile (mais ça exige de faire un peu d'assembleur).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Application client serveur telnet
    Par harrath dans le forum C
    Réponses: 3
    Dernier message: 11/01/2008, 21h24
  2. Serveur telnet et adresse ip
    Par pieroznight dans le forum Web & réseau
    Réponses: 10
    Dernier message: 02/07/2007, 16h27
  3. Recv() Serveur telnet
    Par kiki67100 dans le forum C++
    Réponses: 5
    Dernier message: 29/06/2007, 17h07
  4. Problème client-serveur TELNET.
    Par 0v3rb1t dans le forum Réseau
    Réponses: 5
    Dernier message: 20/05/2007, 16h59
  5. Créer un serveur telnet ssh ?
    Par AsmCode dans le forum C++
    Réponses: 5
    Dernier message: 08/02/2007, 23h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo