Bu yüzden unix-stream yardımcı verileri hakkında çok fazla bilgi okudum, ancak tüm belgelerde eksik olan bir şey, kısmi bir okuma olduğunda ne olması gerekiyor?
24 baytlık bir arabellek için aşağıdaki iletileri aldığımı varsayalım
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)
İlk recvmsg çağrısı, tüm msg1 (ve msg2'nin bir parçası? mesajın verilerle ne yapmamı söylediğini bildiğimde? 20 bayt msg1'den kurtarır ve sonra tekrar recvmsg'yi çağırırsam, msg3 ve msg4'ü aynı anda teslim eder mi? Msg3 ve msg4'ten gelen yardımcı veriler kontrol mesajı yapısında birleştiriliyor mu?
Bunu deneysel olarak bulmak için test programları yazarken, yardımcı verilerin akış bağlamında nasıl davrandığına dair belgeler arıyorum . Üzerinde resmi bir şey bulamam tuhaf görünüyor.
Bu test programından aldığım deneysel bulgularımı buraya ekleyeceğim:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
Linux 3.2.59, 3.17.6
Görünüşe göre bu recvmsg çağrısı sırasında önceden yardımcı ek yükün sağlanması gerekmediği sürece Linux yardımcı mesajların bazı kısımlarını diğer mesajların sonuna ekleyecektir. Bir iletinin yardımcı verileri iletildikten sonra, bir sonraki yardımcı veri iletisini başlatmak yerine kısa bir okuma döndürür. Yani, yukarıdaki örnekte, aldığım okumalar:
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'tan daha fazla hizalama sağlar ve yardımcı veriler içeren bir mesajın başlamasından hemen önce kısa bir okuma sağlar. Ancak, yardımcı bir mesajın sonuna yardımcı olmayan bir mesaj ekleyecektir. Yani BSD için, tamponunuzun yardımcı mesajdan daha büyük olması durumunda, neredeyse paket benzeri davranışlar elde edersiniz. Aldığım okumalar:
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]
YAPMAK:
Hala gibi nasıl vb yaşlı Linux, iOS Solaris, olur nasıl bilmeli ve bu misiniz olabilir gelecekte ne beklenebilir.