عبور بستن نیمهکاره TCP پس از تخلیه بایتهای در انتظار
EOF را در یک پراکسی TCP مدیریت کنید، بدون از دست دادن دادههای صفشده و بدون قطع پاسخ در جهت دیگر.
کارخواه ارسال را تمام میکند، پراکسی EOF را میبیند و پاسخ ناپدید میشود. بستن فوری هر دو سوکت پراکسی میتواند دقیقاً همین توالی را ایجاد کند. در یک رله TCP، پایان مرتب در یک جهت به معنای تمام شدن جهت دیگر نیست.
کارخواهی را در نظر بگیرید که درخواستی میفرستد، سمت ارسال خود را میبندد و منتظر پاسخ میماند:
client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service
پراکسی دو اتصال TCP و دو جریان بایتی دارد که مستقل از هم حرکت میکنند. باید نشانهٔ پایان ورودی را پس از عبور دادن بایتهایی که پیش از آن میآیند، به جلو ببرد.
پیش از عبور دادن EOF، صف را تخلیه کنید
در دریافت با اندازهٔ غیرصفر روی یک جریان TCP، بازگشت صفر نشانهٔ پایان مرتب آن جریان ورودی است. آن جهت خواندن را پایانیافته علامت بزنید. از انتظار برای ورودی بیشتر از آن دست بردارید، اما بایتهایی را که پیشتر برای سوکت مقابل صف شدهاند نگه دارید.
پس از تخلیهٔ صف کارخواه به سرویس، shutdown(service_socket, SHUT_WR) را روی یک سوکت POSIX فراخوانی کنید. این کار ارسال بیشتر به سوی سرویس را پایان میدهد و جهت سرویس به کارخواه را در دسترس نگه میدارد. وقتی سرویس پاسخ خود را تمام کرد، پس از تخلیهٔ صف پاسخ، عمل آینهای را اعمال کنید.
بستن توصیفگرها به همان نقطهای تعلق دارد که هر دو جهت و بافرهای در انتظارشان پایان یافتهاند، یا جایی که خطا یا لغو نیازمند خاتمه است. برای همتایی که هرگز نیمهٔ باقیماندهٔ خود را کامل نمیکند، یک مهلت زمانی محدود نگه دارید.
آمادگی دعوتی برای خواندن است
یک سوکت خواندنی میتواند داده یا وضعیت EOF داشته باشد. recv را فراخوانی کنید و نتیجهٔ آن را تفسیر کنید. شمارشهای مثبت بایتهایی برای عبور دادن هستند؛ صفر پایان جهت است. روی سوکت غیرمسدودساز، EAGAIN یا EWOULDBLOCK یعنی در حال حاضر ورودی بیشتری نیست، در حالی که EINTR ممکن است نیازمند تلاش دوباره باشد. هیچکدام همان رویداد EOF نیستند.
در بافر بایتهای بازگرداندهشده به دنبال پرچم FIN نگردید. TCP یک جریان بایتِ مرتب به این API تحویل میدهد؛ مرزهای بسته و بخش FIN بارمحمولهٔ عادی برنامه نیستند.
این چرخهٔ عمر یک تونل بایت خام است. پراکسی HTTP که پیامها را تجزیه میکند همچنان باید قالببندی HTTP را رعایت کند، و پراکسیای که TLS را پایان میدهد نیز پروتکل بستن TLS دارد. آن تصمیمهای پروتکلی را بالاتر از رلهٔ جهتدار TCP نگه دارید.