Vì vậy, tôi đã đọc rất nhiều thông tin về dữ liệu phụ trợ unix-stream, nhưng một điều còn thiếu trong tất cả các tài liệu là điều gì sẽ xảy ra khi có một phần đọc?
Giả sử tôi đang nhận các thông báo sau vào bộ đệm 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)
Cuộc gọi đầu tiên tới recvmsg, tôi nhận được tất cả các tin nhắn1 (và một phần của Trình tin2? Hệ điều hành có bao giờ làm điều đó không?) khi tôi biết tin nhắn thực sự bảo tôi làm gì với dữ liệu? Nếu tôi giải phóng 20 byte từ Trình tin1 và sau đó gọi lại recvmsg, liệu nó có bao giờ phân phối tệp tin 3 và Trình tin 4 không? Liệu các dữ liệu phụ trợ từ dir3 và dir4 có được nối với nhau trong cấu trúc thông điệp điều khiển không?
Mặc dù tôi có thể viết các chương trình thử nghiệm để tìm hiểu thực nghiệm điều này, tôi đang tìm tài liệu về cách dữ liệu phụ trợ hoạt động trong bối cảnh phát trực tuyến. Có vẻ kỳ lạ là tôi không thể tìm thấy bất cứ điều gì chính thức về nó.
Tôi sẽ thêm các kết quả thử nghiệm của mình vào đây, mà tôi đã nhận được từ chương trình thử nghiệm này:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Dường như Linux sẽ nối các phần của các tin nhắn mang phụ trợ vào cuối các tin nhắn khác miễn là không cần phải tải trọng phụ trợ trước trong cuộc gọi này tới recvmsg. Khi dữ liệu phụ trợ của một tin nhắn được gửi, nó sẽ trả về một lần đọc ngắn thay vì bắt đầu tin nhắn dữ liệu phụ trợ tiếp theo. Vì vậy, trong ví dụ trên, số lần đọc tôi nhận được là:
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 cung cấp sự liên kết nhiều hơn Linux và đọc ngắn ngay trước khi bắt đầu một tin nhắn có dữ liệu phụ trợ. Nhưng, nó sẽ vui vẻ nối một tin nhắn không mang phụ trợ vào cuối tin nhắn mang phụ trợ. Vì vậy, đối với BSD, có vẻ như nếu bộ đệm của bạn lớn hơn thông báo mang phụ trợ, bạn sẽ có hành vi gần giống như gói. Các bài đọc tôi nhận được là:
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]
LÀM:
Vẫn muốn biết nó xảy ra như thế nào trên Linux, iOS, Solaris, v.v. và làm thế nào nó có thể xảy ra trong tương lai.