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.