ক্লায়েন্ট পাঠানো শেষ করে, প্রক্সি EOF দেখে, আর উত্তরটি হারিয়ে যায়। দুটি প্রক্সি সকেটই সঙ্গে সঙ্গে বন্ধ করলে ঠিক এই ক্রমটিই ঘটতে পারে। TCP রিলেতে এক দিকে সুশৃঙ্খল সমাপ্তি মানে এই নয় যে অন্য দিকটিও শেষ হয়েছে।

এমন একটি ক্লায়েন্টের কথা ভাবুন যে অনুরোধ পাঠায়, তার পাঠানোর দিক বন্ধ করে এবং উত্তরের জন্য অপেক্ষা করে:

client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service

প্রক্সির দুটি TCP সংযোগ এবং স্বাধীনভাবে চলমান দুটি বাইট স্ট্রিম রয়েছে। এর আগে থাকা বাইটগুলো ফরওয়ার্ড করার পর এটিকে ইনপুটের সমাপ্তির সংকেতটিও সামনে বহন করতে হবে।

EOF ফরওয়ার্ড করার আগে সারি নিষ্কাশন করুন

TCP স্ট্রিমে অশূন্য আকারের রিসিভে শূন্য ফেরত আসা সেই আগত স্ট্রিমের সুশৃঙ্খল সমাপ্তি বোঝায়। সেই পড়ার দিকটিকে সমাপ্ত হিসেবে চিহ্নিত করুন। তা থেকে আরও ইনপুটের অপেক্ষা বন্ধ করুন, তবে বিপরীত সকেটের জন্য ইতিমধ্যে সারিবদ্ধ বাইটগুলো ধরে রাখুন।

ক্লায়েন্ট-থেকে-সার্ভিস সারি নিষ্কাশিত হলে POSIX সকেটে shutdown(service_socket, SHUT_WR) কল করুন। এটি সার্ভিসের দিকে আরও প্রেরণ শেষ করে, তবে সার্ভিস-থেকে-ক্লায়েন্ট দিকটি উপলব্ধ রাখে। সার্ভিস যখন তার উত্তর শেষ করে, তখন উত্তরের সারি নিষ্কাশনের পর মিরর করা ক্রিয়াটি প্রয়োগ করুন।

ডেসক্রিপ্টর বন্ধ করা উচিত সেই বিন্দুতে যেখানে উভয় দিক ও তাদের অপেক্ষমাণ বাফার শেষ হয়, অথবা যেখানে কোনো ত্রুটি বা বাতিলের জন্য সমাপ্তি প্রয়োজন। এমন পিয়ারের জন্য সীমিত সময়সীমা রাখুন যে কখনও তার অবশিষ্ট অর্ধেক সম্পূর্ণ করে না।

প্রস্তুতি পড়ার আমন্ত্রণ

একটি পঠনযোগ্য সকেটে ডেটা বা EOF অবস্থা থাকতে পারে। recv কল করুন এবং তার ফলাফল ব্যাখ্যা করুন। ধনাত্মক সংখ্যা হলো ফরওয়ার্ড করার বাইট; শূন্য হলো দিকের সমাপ্তি। ননব্লকিং সকেটে EAGAIN বা EWOULDBLOCK মানে এখন আরও ইনপুট নেই, অন্যদিকে EINTR-এ পুনরায় চেষ্টা লাগতে পারে। কোনোটিই EOF-এর মতো একই ঘটনা নয়।

ফেরত পাওয়া বাইট বাফারে FIN ফ্ল্যাগ খুঁজবেন না। TCP এই API-তে একটি ক্রমানুসারী বাইট স্ট্রিম পৌঁছায়; প্যাকেটের সীমানা ও FIN সেগমেন্ট সাধারণ অ্যাপ্লিকেশন পেলোড নয়।

এটি একটি কাঁচা বাইট টানেলের জীবনচক্র। বার্তা পার্স করা HTTP প্রক্সিকেও HTTP ফ্রেমিং মানতে হয়, এবং TLS-সমাপ্তকারী প্রক্সিরও একটি TLS শাটডাউন প্রোটোকল থাকে। সেই প্রোটোকল সিদ্ধান্তগুলো দিকভিত্তিক TCP রিলের উপরে রাখুন।

সম্পর্কিত নিবন্ধ