Un petit réseau local en C

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 14 Jan 2015, 17:49

ampholyte a écrit:Tu peux te tourner vers la fonction :
http://linux.die.net/man/2/time
Code: Tout sélectionner
time_t time(time_t *time);


Tu peux l'utiliser comme ceci :

Code: Tout sélectionner
time_t t = time(NULL);
cela te retourne le nombre de secondes depuis le 1970-01-01 00:00:00 +0000 (UTC).

Si tu as besoin de mesurer des durées plus faible que la seconde, tu peux regarder cette fonction :
http://linux.die.net/man/2/gettimeofday



Oui je sais comment on l'utilise..mais justement.


Comment je sais à quel moment m'arrêter.


je pourrais faire un truc du style

Tan que LastTime - 1erTime != timer

1erTime serait fixé au départ de l'action.
Mais le last...il faudrait que je le lance en quelque sorte toutes les secondes pour savoir à quel moment m'arrêter non ?
Et c'est ça que je trouve bizarre ^^


EDIT:


Une autre solution ça pourrait être un truc comme ça

while (timer > 0)
{
timer--; //on décrémente la valeur de timer
sleep(1000); //patienter 1s dans chaque exécution de la boucle
}

Là je vais bien attendre...mais c'est pas complètement ce que je veux...d'une part parce que le temps avant d'arriver au sleep n'est pas compté...certes il est infime mais il n'est pas compté.
Et d'autre part ça ne permet pas de travailler indépendamment le programme et le timer.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 15 Jan 2015, 09:01

La fonction accept est bloquante si ta socket est bloquante donc elle va attendre la prochaine connexion.

Je te conseille de bien lire le man et de regarder les fonctions select / poll également qui pourront plus répondre à tes attentes.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 15 Jan 2015, 13:17

Bon, sans parler forcement de socket ni de réseau, je me suis rendu compte d'un comportement intéressant mais que je ne sais pas m'expliquer.


Code: Tout sélectionner
void traitement()
{
   printf("Dommage vous n'avez pas été assez rapide !\n");
   exit(0);
}



Code: Tout sélectionner
void jouerDifficulte3(int binf,int bsup,int nbPropo,int mystere)
{
   printf("Vous avez %d secondes pour trouver le nombre mystere !!!\n\n",NB_SECONDES);
   alarm(NB_SECONDES);
   while(1)
   {
                //ici je fais une boucle infini pour faciliter mon test; en réalité elle ne sert à rien dans le code simplifié que je propose ici
      int nbPropoRestante=nbPropo;
      int proposition;
      printf("Vous avez le droit à %d tentatives \n",nbPropo);
      do {
         signal(SIGALRM,traitement);
         printf("Nombre mystere :  ");
         scanf("%d",&proposition);
         nbPropoRestante--;
         printf("Il vous reste %d tentatives \n",nbPropoRestante);
         if(proposition > mystere)
         {
            int decalage=calcul_nbAleat(FUYANT_INF,FUYANT_SUP);
            mystere=mystere+decalage;
            printf("C'est plus petit !\n");
         }
         else if(proposition < mystere)
         {
            int decalage=calcul_nbAleat(FUYANT_INF,FUYANT_SUP);
            mystere=mystere+decalage;
            printf("C'est plus grand !\n");
         }
         else
         {
            printf("Félicitation - Vous avez trouvé le nombre mystère en %d tentatives\n",(nbPropo - nbPropoRestante));
         }

         if(nbPropoRestante==0 && mystere != proposition)
         {
            printf("Dommage vous avez échoué le nombre mystère était %d \n",mystere);
         }
      }while((nbPropoRestante != 0) && (mystere != proposition));
   }
}


Au final ce n'est qu'une énième version simplifié du + ou -

Je place un timer et si le timer arrive à expiration alors je force le programme à s'arrêter avec le traitement.

Sa c'est ce que javais pensé au moment de faire ça.

Mais j'ai observé un comportement plus intéressant.



J'ai laissé tourné mon programme sur le scanf sans rien saisir pour arriver à expiration du timer et voir si mon programme s'arrêtait bien au coup suivant.

Sauf que; le traitement s'est exécuté dès que j'ai reçu mon signal alors que je n'étais pas sur la ligne de code en question.


DU coup je me demandais comment c'était possible ?

Lorsque le programme a vu signal il fait quoi ? Il donne la priorité à cette fonction et check aussi souvent que possible l'arrivée de signaux ?

Dans ce cas là cela ne sert à rien de vérifier à chaque tour de boucle ? Et d'ailleurs l'emplacement de l'appel au signal n'a plus grande importance du moment qu'il est après alarm.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 15 Jan 2015, 13:33

Je te conseille de bien lire la manpage concernant signal pour comprendre comment tout cela fonctionne :
http://manpagesfr.free.fr/man/man7/signal.7.html

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite