সুতরাং আমি ইউনিক্স-স্ট্রিম আনুষঙ্গিক ডেটাতে প্রচুর তথ্য পড়েছি, তবে সমস্ত ডকুমেন্টেশন থেকে একটি জিনিস অনুপস্থিত যা একটি আংশিক পড়া আছে তখন কী ঘটবে বলে মনে করা হচ্ছে?
ধরুন আমি নিম্নলিখিত বার্তাগুলি একটি 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- এ প্রথম কলটি, আমি সবগুলি পেয়েছি # 1 (এবং msg2 এর অংশ? ওএস কি কখনও তা করতে পারে?) যদি আমি msg2 এর অংশ পাই, তবে আমি কি এখনই আনুষঙ্গিক ডেটা পেয়েছি এবং পরবর্তী পঠনের জন্য এটি সংরক্ষণ করা দরকার? যখন আমি জানি বার্তাটি আসলে আমাকে ডেটাটি করতে বলছিল কি? আমি যদি # 1 থেকে 20 বাইটগুলি খালি করে দিই এবং পুনরায় recvmsg কল করি তবে এটি কি একই সাথে একবারে msg3 এবং msg4 সরবরাহ করবে? কন্ট্রোল মেসেজ স্ট্রাক্টে কি জিপি 3 এবং ইএসপি 4 এর আনুষঙ্গিক ডেটা সংযুক্ত করা যায়?
পরীক্ষামূলকভাবে এটি অনুসন্ধান করার জন্য আমি পরীক্ষার প্রোগ্রামগুলি লিখতে পারার সময়, আমি স্ট্রিমিং প্রসঙ্গে আনুষঙ্গিক ডেটা কীভাবে আচরণ করে সে সম্পর্কে নথিপত্র খুঁজছি । এটি অদ্ভুত বলে মনে হচ্ছে যে আমি এটিতে কোনও অফিসিয়াল পাই না।
আমি এখানে আমার পরীক্ষামূলক অনুসন্ধানগুলি যুক্ত করতে যাচ্ছি যা আমি এই পরীক্ষার প্রোগ্রাম থেকে পেয়েছি:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
লিনাক্স 3.2.59, 3.17.6
দেখা যাচ্ছে যে লিনাক্স অন্য বার্তাগুলির শেষের দিকে আনিসিলারি বহনকারী বার্তাগুলির কিছু অংশ যুক্ত করবে যতক্ষণ না এই কলটি পুনরায় 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]
বিএসডি 4.4, 10.0
বিএসডি লিনাক্সের চেয়ে আরও প্রান্তিককরণ সরবরাহ করে এবং সহায়ক ডেটা সহ বার্তা শুরুর আগে অবিলম্বে একটি সংক্ষিপ্ত পঠন দেয় । তবে, এটি আনুষঙ্গিকভাবে একটি আনুষাঙ্গিক-বহনকারী বার্তাটির শেষে একটি অ-বিভাগীয়-বহনকারী বার্তা যুক্ত করবে। সুতরাং বিএসডি-র জন্য, দেখে মনে হচ্ছে আপনার বাফারটি সহায়ক-বহন বার্তার চেয়ে বড়, আপনি প্রায় প্যাকেটের মতো আচরণ পান। আমি যে পঠন পাই তা হ'ল:
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 সোলারিস, ইত্যাদি উপর ঘটে, এবং কিভাবে এটা করতে পারে ভবিষ্যতে ঘটতে হবে বলে আশা করা।