ดังนั้นฉันได้อ่านข้อมูลมากมายเกี่ยวกับข้อมูลเสริมยูนิกซ์ แต่สิ่งหนึ่งที่ขาดหายไปจากเอกสารทั้งหมดคือสิ่งที่ควรจะเกิดขึ้นเมื่อมีการอ่านบางส่วน?
สมมติว่าฉันได้รับข้อความต่อไปนี้ในบัฟเฟอร์ 24 ไบต์
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)
การเรียกครั้งแรกเพื่อ recvmsg ฉันได้รับ msg1 ทั้งหมด (และเป็นส่วนหนึ่งของ msg2 ระบบปฏิบัติการจะทำเช่นนั้นหรือไม่) ถ้าฉันได้รับส่วนหนึ่งของ msg2 ฉันจะได้รับข้อมูลเสริมทันทีและจำเป็นต้องบันทึกไว้สำหรับการอ่านครั้งต่อไป เมื่อฉันรู้ว่าสิ่งที่ข้อความจริงบอกให้ฉันทำกับข้อมูล? หากฉันเพิ่มขนาด 20 ไบต์จาก msg1 แล้วโทร recvmsg อีกครั้งจะส่ง msg3 และ msg4 พร้อมกันหรือไม่ ข้อมูลเสริมจาก msg3 และ msg4 เชื่อมต่อกันในโครงสร้างข้อความควบคุมหรือไม่?
ในขณะที่ฉันสามารถเขียนโปรแกรมทดสอบเพื่อค้นหาสิ่งนี้ฉันกำลังมองหาเอกสารเกี่ยวกับการทำงานของข้อมูลเสริมในบริบทการสตรีม ดูเหมือนว่าแปลกที่ฉันไม่สามารถหาอะไรเป็นทางการเกี่ยวกับเรื่องนี้
ฉันจะเพิ่มผลการทดลองของฉันที่นี่ซึ่งฉันได้จากโปรแกรมทดสอบนี้:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
ปรากฏว่า Linux จะต่อท้ายข้อความที่มีเครื่องหมายเสริมต่อท้ายข้อความอื่น ๆ ตราบใดที่ไม่มีส่วนของข้อมูลเสริมก่อนหน้านี้ที่จำเป็นต้องส่งมอบในระหว่างการเรียกนี้ไปยัง recvmsg เมื่อมีการส่งข้อมูลเสริมของข้อความหนึ่งข้อความจะส่งคืนการอ่านสั้น ๆ แทนที่จะเริ่มข้อความเสริมข้อมูลถัดไป ดังนั้นในตัวอย่างด้านบนการอ่านที่ฉันได้รับคือ:
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 จัดให้มีการจัดตำแหน่งมากกว่า Linux และให้อ่านสั้น ๆ ทันทีก่อนที่จะเริ่มข้อความที่มีข้อมูลเสริม แต่มันจะเพิ่มข้อความที่ไม่มีเครื่องหมายเสริมต่อท้ายข้อความที่มีเครื่องหมายเสริมอย่างมีความสุข ดังนั้นสำหรับ BSD ดูเหมือนว่าหากบัฟเฟอร์ของคุณมีขนาดใหญ่กว่าข้อความที่แสดงว่าคุณได้รับพฤติกรรมเกือบเหมือนแพ็กเก็ต การอ่านที่ฉันได้รับคือ:
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]
ทำ:
ยังต้องการที่จะรู้ว่ามันเกิดขึ้นบนลินุกซ์เก่า, iOS, Solaris, ฯลฯ และวิธีการที่มันอาจจะคาดว่าจะเกิดขึ้นในอนาคต