Então, eu li muitas informações sobre dados auxiliares de fluxo unix, mas uma coisa que falta em toda a documentação é o que deveria acontecer quando há uma leitura parcial?
Suponha que eu esteja recebendo as seguintes mensagens em um buffer de 24 bytes
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)
Na primeira chamada para recvmsg, recebo todo o msg1 (e parte do msg2? O sistema operacional fará isso?) Se eu faço parte do msg2, obtenho os dados auxiliares imediatamente e preciso salvá-los para a próxima leitura quando eu sei o que a mensagem estava realmente me dizendo para fazer com os dados? Se eu liberar os 20 bytes do msg1 e depois ligar novamente para recvmsg, ele entregará o msg3 e o msg4 ao mesmo tempo? Os dados auxiliares de msg3 e msg4 são concatenados na estrutura da mensagem de controle?
Embora eu possa escrever programas de teste para descobrir isso experimentalmente, estou procurando documentação sobre como os dados auxiliares se comportam em um contexto de streaming. Parece estranho que eu não consiga encontrar nada oficial nele.
Vou adicionar minhas descobertas experimentais aqui, que obtive deste programa de teste:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Parece que o Linux anexará partes das mensagens de suporte auxiliar ao final de outras mensagens, desde que nenhuma carga útil auxiliar anterior precise ser entregue durante esta chamada para recvmsg. Quando os dados auxiliares de uma mensagem estiverem sendo entregues, ele retornará uma leitura curta em vez de iniciar a próxima mensagem de dados auxiliares. Portanto, no exemplo acima, as leituras que recebo são:
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
O BSD fornece mais alinhamento que o Linux e fornece uma breve leitura imediatamente antes do início de uma mensagem com dados auxiliares. Mas, felizmente, anexará uma mensagem de suporte não auxiliar ao final de uma mensagem de suporte auxiliar. Portanto, para o BSD, parece que se o seu buffer for maior que a mensagem de suporte auxiliar, você terá um comportamento quase semelhante a um pacote. As leituras que recebo são:
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]
FAÇAM:
Ainda gostaria de saber como isso acontece no Linux, iOS, Solaris, etc. mais antigo, e como isso pode acontecer no futuro.