J'ai donc lu beaucoup d'informations sur les données auxiliaires d'Unix-stream, mais une chose qui manque dans toute la documentation est ce qui est censé se passer quand il y a une lecture partielle?
Supposons que je reçois les messages suivants dans un tampon de 24 octets
msg1 [20 byes] (no ancillary data)
msg2 [7 bytes] (2 file descriptors)
msg3 [7 bytes] (1 file descriptor)
msg4 [10 bytes] (no ancillary data)
msg5 [7 bytes] (5 file descriptors)
Le premier appel à recvmsg, j'obtiens l'intégralité de msg1 (et une partie de msg2? Est-ce que le système d'exploitation le fera?) quand je sais ce que le message me disait réellement de faire avec les données? Si je libère les 20 octets de msg1 et que j'appelle à nouveau recvmsg, est-ce qu'il livrera jamais msg3 et msg4 en même temps? Les données auxiliaires de msg3 et msg4 sont-elles concaténées dans la structure du message de contrôle?
Bien que je puisse écrire des programmes de test pour le découvrir expérimentalement, je cherche de la documentation sur le comportement des données auxiliaires dans un contexte de streaming. Il semble étrange que je ne trouve rien de officiel là-dessus.
Je vais ajouter mes résultats expérimentaux ici, que j'ai obtenus de ce programme de test:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Il semble que Linux ajoute des parties de messages auxiliaires à la fin des autres messages tant qu'aucune charge utile auxiliaire préalable n'a dû être remise lors de cet appel à recvmsg. Une fois que les données auxiliaires d'un message sont livrées, il retournera une courte lecture plutôt que de démarrer le prochain message de données auxiliaires. Ainsi, dans l'exemple ci-dessus, les lectures que j'obtiens sont:
recv1: [24 bytes] (msg1 + partial msg2 with msg2's 2 file descriptors)
recv2: [10 bytes] (remainder of msg2 + msg3 with msg3's 1 file descriptor)
recv3: [17 bytes] (msg4 + msg5 with msg5's 5 file descriptors)
recv4: [0 bytes]
BSD 4.4, 10.0
BSD fournit plus d'alignement que Linux et donne une courte lecture immédiatement avant le début d'un message avec des données auxiliaires. Mais, il ajoutera volontiers un message non auxiliaire à la fin d'un message auxiliaire. Donc, pour BSD, il semble que si votre tampon est plus grand que le message auxiliaire, vous obtenez un comportement presque semblable à un paquet. Les lectures que je reçois sont:
recv1: [20 bytes] (msg1)
recv2: [7 bytes] (msg2, with msg2's 2 file descriptors)
recv3: [17 bytes] (msg3, and msg4, with msg3's 1 file descriptor)
recv4: [7 bytes] (msg5 with 5 file descriptors)
recv5: [0 bytes]
FAIRE:
J'aimerais toujours savoir comment cela se produit sur les anciens Linux, iOS, Solaris, etc., et comment cela pourrait se produire à l'avenir.