Re: Micropython, sockets, multicast, et recvfrom()

Top Page

Reply to this message
Author: Edgar Bonet
Date:  
To: guilde
Subject: Re: Micropython, sockets, multicast, et recvfrom()
Bonjour !

Frédéric a écrit :
> En principe, la méthode recvfrom() d'un objet socket retourne le
> couple (data, from), où from est lui-même le couple (ip, port) de la
> machine qui a envoyé le message.
>
> La data est correcte, aucun souci à ce niveau, mais le champ from,
> lui, sous le port unix, a la forme :
>
> \x02\x00\x0e\x57\xc0\xa8\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00
>
> [...] Je vois bien les bonnes valeurs, dans la trame :
>
> - port aux indices 2 et 3
> - ip aux indices 4, 5, 6, 7
>
> mais je ne pige pas à quoi correspondent les 2 premiers octets, ni
> pourquoi c'est bourré de zéros à la fin.


Sous Unix, l'adresse à laquelle est connecté un socket est représentée
par cette structure (c.f. bind(2)):

    struct sockaddr {
        sa_family_t sa_family;
        char        sa_data[14];
    }


En pratique, celle-ci est utilisée comme une `union` de différents types
qui correspondent à plusieurs familles d'adresses. Pour IPv4, la
structure utilisée est (c.f. ip(7)):

    struct sockaddr_in {
        sa_family_t    sin_family; /* address family: AF_INET */
        in_port_t      sin_port;   /* port in network byte order */
        struct in_addr sin_addr;   /* internet address */
    };


De ce que je comprends, ton Micropython te montre la structure sockaddr
à l'état brut :

  – Les deux premiers octets contiennent le champ sa_family, qui vaut
    AF_INET (c.-à-d. 2).


  – Les derniers octets sont du padding pour tomber sur la taille de
    `struct sockaddr`, qui est plus grand que `struct sockaddr_in` à
    cause d'autres familles d'adresses qui ont besoin de plus de place.


À+,

Edgar.