NetLink lui-même ne se soucie pas de savoir si les données sont une chaîne, un entier, une structure, etc. Il suffit d'un vide * et d'une longueur et de copier les données sans les regarder. Vous pouvez convertir votre structure en un void * et utiliser sizeof pour déterminer la longueur et envoyer ces données via netlink. De l'autre côté, il suffit d'obtenir le vide * et la longueur, de vérifier que la longueur correspond à ce qu'elle est censée être et de renvoyer le void * à un pointeur vers votre struct. Les deux choses importantes à vérifier sont:
Tant le UserSpace et le code d'accord sur le espace noyau mise en page de la mémoire de la structure. Cela signifie compiler les deux par rapport au même .h et s'assurer que les options de compilation sont telles que la disposition de la mémoire et l'alignement sont les mêmes.
struct sera transféré comme une simple copie de la mémoire brute, theres aucune intelligence pour la fixation des pointeurs, de sorte que votre struct ne peut pas contenir de pointeurs, etc.
L'autre option est plutôt que d'envoyer les données brutes, pour "sérialiser" les données vous-même en les convertissant en, à partir d'une chaîne dans un format connu. Cela vous permettrait de gérer des structures de données plus complexes au détriment des surcharges CPU et mémoire
Si tout le reste échoue, vous pouvez sérialiser vos données et envoyer la chaîne – pmg
hmm ... ne pensait pas à cela. Est-ce que C supporte la sérialisation? De plus, si j'envoie la chaîne, est-ce que string.h lib est disponible dans l'espace noyau pour faire des comparaisons de chaînes? – Alkesh
Je ne pense pas, vous avez besoin d'un support spécial de sérialisation, vous pouvez simplement copier le contenu de la structure. Les deux côtés de la socket Netlink fonctionnent toujours sur le même système, donc la disposition binaire est plus ou moins pertinente. – lunaryorn