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

Réseau C Discussion :

return et exit, comment les utiliser proprement ? + parsage d'adresse ethernet


Sujet :

Réseau C

  1. #21
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Voilà le résultat :

    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
    int
    send_packet (int sockfd, const void *buff, size_t const bufflen, const struct sockaddr *to, socklen_t const tolen)
    {
        size_t   sent = 0;
        ssize_t  n = 0;
        int      err = 0;
     
        while (sent != bufflen)
        {
            /* n = sendto (sockfd, buff, bufflen, 0, to, tolen); */
            n = sendto (sockfd, buff + sent, bufflen - sent, 0, to, tolen);
     
            if (n >= 0)
                sent += n;
            else
            {
                /* On force la sortie */
                sent = bufflen;
                err = 1;
            }
        }
     
        return err;
    }

  2. #22
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Freed0
    Voilà le résultat :
    J'ai bien peur que tu envoies toujours la même chose... Il faut progresser, donc envoyer 'buff + sent' (et corriger ce qu'il reste à envoyer)... non ?

    C'est pas ce que j'avais mis dans mon algo ?
    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
     
    /* non teste */
       size_t const len = strlen (text);
       size_t sent = 0;
     
       while (sent != len)
       {
          int n = send (socket, text + sent, len - sent, 0);
     
          if (n >=0)
          {
             sent += n;
          }
          else
          {
             /* erreur de transmission */
          }
       }
    A quoi ca sert que je donne des réponses si on en tient pas compte ? Il y a des choses que je ne comprendrais jamais...

  3. #23
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Roh comment j'ai pu oublier ça

  4. #24
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Une idée pour éviter ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    src/main.c: In function 'send_packet':
    src/main.c:193: warning: pointer of type 'void *' used in arithmetic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    93:  n = sendto (sockfd, buff + sent, bufflen - sent, 0, to, tolen);
    On peut pas recaster ça Donc je vois pas trop ce qui nous permettrait de modifier l'adresse de départ lors de l'envoi...

  5. #25
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Freed0
    Une idée pour éviter ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    src/main.c: In function 'send_packet':
    src/main.c:193: warning: pointer of type 'void *' used in arithmetic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    93:  n = sendto (sockfd, buff + sent, bufflen - sent, 0, to, tolen);
    On peut pas recaster ça Donc je vois pas trop ce qui nous permettrait de modifier l'adresse de départ lors de l'envoi...
    buff devrait être de type unsigned char *, sinon utiliser un pointeur local de ce type...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ... f (..., void *buff, ...)
    {
       unsigned char *o_buff = buff;
     
       n = sendto (sockfd, o_buff + sent, bufflen - sent, 0, to, tolen);

  6. #26
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    J'y ai pensé, mais si on veut envoyer autre chose que des octets non-signés ?

  7. #27
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Freed0
    J'y ai pensé, mais si on veut envoyer autre chose que des octets non-signés ?
    Je ne pense pas qu'un socket sache envoyer autre chose...

  8. #28
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Bon, pour ne pas créer de nouveau sujet à chaque fois, j'ai une petite question sur le cast :

    J'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct icmp      icmp = {0};
    pid_t            pid = getpid();
    unsigned short   sent = 0;
     
    icmp.icmp_type  = ICMP_ECHO;
    icmp.icmp_code  = 0;
    icmp.icmp_id    = pid;
    icmp.icmp_seq   = sent++;
    icmp.icmp_cksum = 0;
    Sachant que la structure icmp est composée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Type      |     Code      |          Checksum             |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |           Identifier          |        Sequence Number        |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
       |     Data ...
       +-+-+-+-+-
    Faut-il caster le Process ID pour le placer dans le membre icmp_id ?

  9. #29
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Freed0
    Faut-il caster le Process ID pour le placer dans le membre icmp_id ?
    Pourquoi voudrais-tu le caster ?

  10. #30
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Bah pid_t occupe 4 bytes et icmp_id en occupe 2...

  11. #31
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Freed0
    Bah pid_t occupe 4 bytes et icmp_id en occupe 2...
    Ben moi je dis que tu n'as pas besoin de caster.

  12. #32
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Citation Envoyé par Skyrunner
    Ben moi je dis que tu n'as pas besoin de caster.
    C'est ça que je voulais savoir. Merci

  13. #33
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    N'est-on pourtant pas supposé caster quand on copie d'un type entier vers un type entier plus petit ?

  14. #34
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Je suis tombé sur un tableau assez interessant :

    http://docs.hp.com/en/B3901-90003/ch...sting-integers

    Apparament une conversion de type int vers short serait dans la catégorie C :

    CASE C: Casting Integers to a Smaller Type

    When an int value is cast to a narrower type (short or char), the excess bits on the left are discarded. The same is true when a short is cast to a char, or when a long in 64-bit mode is cast to an int. For instance, if an int is cast to a short, the 16 leftmost bits are truncated. The following table of values illustrates these conversions.

    ...

    If, after casting to a signed type, the leftmost bit is 1, then the number is negative. However, if you cast to an unsigned type and after the shortening the leftmost bit is 1, then that 1 is part of the value (it is not the sign bit).
    Etant donné que dans mon cas, je cast un int en unsigned short, il n'y a rien à faire. Mais si cela aurait été un signed short, il aurait fallu le caster en unsigned short... Enfin c'est ce que j'ai compris du texte

  15. #35
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Hélas, ça ne dit pas si la conversion est implicite ou doit être explicite...

  16. #36
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    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
    #include <stdio.h>
     
    int
    main (void)
    {
    	int		pid = 80000;
    	unsigned short	s_pid = 0;
     
    	printf("pid (int) : %d (0x%08x)\n", pid, pid);
     
    	s_pid = pid;
    	printf("pid (no cast) : %hd (0x%x)\n", s_pid, s_pid);
     
    	s_pid = (unsigned short) pid;
    	printf("pid (cast) : %hd (0x%x)\n", s_pid, s_pid);
     
    	s_pid = pid & 0xffff;
    	printf("pid (mask) : %hd (0x%x)\n", s_pid, s_pid);
     
    	return 0;
    }
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pid (int) : 80000 (0x00013880)
    pid (no cast) : 14464 (0x3880)
    pid (cast) : 14464 (0x3880)
    pid (mask) : 14464 (0x3880)
    De toute façon, je devrai quand même caster le Process ID quand je récupèrerai la réponse ICMP, pour pouvoir le comparer avec la valeur reçue.

  17. #37
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Et pas un warning sans le cast ?
    OK, la norme de doit sans-doute pas l'exiger, les warnings doivent donc être fournis pas le compilo en tant qu'extensions...

  18. #38
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    N'est-on pourtant pas supposé caster quand on copie d'un type entier vers un type entier plus petit ?
    C'est pas obligatoire. Le cast implicite suffit, mais ça peut faire raler le compilateur ("Eh, le programmeur, es tu bien sûr de ce que tu fais ?").

    Par contre, oui, il y a risque de perte de données si le short est plus petit que l'int (ce qui n'a rien d'une obligation).

  19. #39
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Tiens, pour éxécuter du code tous les x temps, y'a quoi de bien ?
    En décortiquant la source d'un soft, j'ai vu qu'on pouvait utiliser SIGALRM. Y'a quoi d'autres ? C'est pour envoyer une requête ICMP toutes les secondes en gros.
    Pour la réception et les time out, je pense que select() sera le plus adapté. D'autres idées ?

    Merci

  20. #40
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Freed0
    Tiens, pour éxécuter du code tous les x temps, y'a quoi de bien ?
    En décortiquant la source d'un soft, j'ai vu qu'on pouvait utiliser SIGALRM. Y'a quoi d'autres ? C'est pour envoyer une requête ICMP toutes les secondes en gros.
    Pour la réception et les time out, je pense que select() sera le plus adapté. D'autres idées ?

    Merci
    Tu veux que ça coupe ce que tu es en train de faire pour faire le ping ? Une sorte d'interruption ??

Discussions similaires

  1. garbage collector et finalize() Comment les utiliser ?
    Par HighSchool2005 dans le forum Langage
    Réponses: 17
    Dernier message: 03/04/2007, 15h25
  2. [VS.NET][Ressources]Comment les utiliser
    Par NicolasJolet dans le forum Visual Studio
    Réponses: 2
    Dernier message: 06/10/2006, 11h16
  3. Réponses: 1
    Dernier message: 13/12/2005, 17h48
  4. [Properties] comment les utiliser ?
    Par Kyti dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 25/03/2005, 10h37
  5. Réponses: 7
    Dernier message: 13/03/2005, 16h45

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