Jadi saya sudah membaca banyak informasi tentang data tambahan unix-stream, tetapi satu hal yang hilang dari semua dokumentasi adalah apa yang seharusnya terjadi ketika ada sebagian membaca?
Misalkan saya menerima pesan berikut ke buffer 24 byte
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)
Panggilan pertama ke recvmsg, saya mendapatkan semua msg1 (dan bagian dari msg2? Apakah OS akan pernah melakukan itu?) Jika saya mendapatkan bagian dari msg2, apakah saya mendapatkan data tambahan segera, dan perlu menyimpannya untuk dibaca selanjutnya ketika saya tahu apa yang sebenarnya dikatakan oleh pesan kepada saya tentang data tersebut? Jika saya membebaskan 20 byte dari msg1 dan kemudian memanggil recvmsg lagi, akankah ia mengirimkan pesan ps3 dan pesan secara bersamaan? Apakah data tambahan dari msg3 dan msg4 disatukan dalam struct pesan kontrol?
Sementara saya dapat menulis program pengujian untuk mengetahui hal ini secara eksperimental, saya mencari dokumentasi tentang bagaimana data tambahan berperilaku dalam konteks streaming. Tampaknya aneh bahwa saya tidak dapat menemukan sesuatu yang resmi di situ.
Saya akan menambahkan temuan percobaan saya di sini, yang saya dapatkan dari program tes ini:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Tampaknya Linux akan menambahkan bagian-bagian dari pesan tambahan di akhir pesan lainnya selama tidak ada muatan tambahan yang perlu dikirimkan selama panggilan ini ke recvmsg. Setelah data tambahan satu pesan dikirimkan, itu akan mengembalikan bacaan singkat daripada memulai pesan data tambahan berikutnya. Jadi, dalam contoh di atas, bacaan yang saya dapatkan adalah:
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 menyediakan lebih banyak perataan daripada Linux, dan memberikan bacaan singkat segera sebelum memulai pesan dengan data tambahan. Tapi, itu akan dengan senang hati menambahkan pesan yang tidak mengandung pendukung sampai akhir dari pesan yang mengandung pendukung. Jadi untuk BSD, sepertinya jika buffer Anda lebih besar dari pesan tambahan, Anda mendapatkan perilaku hampir seperti paket. Bacaan yang saya dapatkan adalah:
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]
MELAKUKAN:
Masih ingin tahu bagaimana hal itu terjadi pada Linux yang lebih lama, iOS, Solaris, dll, dan bagaimana hal itu bisa diharapkan terjadi di masa depan.