Müştəri göndərməni bitirir, proksi EOF görür və cavab yox olur. Hər iki proksi soketini dərhal bağlamaq məhz bu ardıcıllığa səbəb ola bilər. TCP relay-də bir istiqamətdə nizamlı sonluq digər istiqamətin bitdiyini ifadə etmir.

Sorğu göndərən, göndərmə tərəfini bağlayan və cavabı gözləyən müştərini nəzərdən keçirin:

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

Proksinin iki TCP bağlantısı və müstəqil hərəkət edən iki bayt axını var. O, girişin sonu göstəricisini özündən əvvəl gələn baytları ötürdükdən sonra irəli aparmalıdır.

EOF-u ötürməzdən əvvəl növbəni boşaldın

TCP axınında sıfırdan fərqli ölçülü qəbul üçün sıfırın qaytarılması həmin gələn axının nizamlı sonunu göstərir. Həmin oxuma istiqamətini bitmiş kimi işarələyin. Ondan daha çox giriş gözləməyi dayandırın, lakin qarşı soket üçün artıq növbəyə qoyulmuş baytları saxlayın.

Müştəridən xidmətə növbə boşaldıqdan sonra POSIX soketində shutdown(service_socket, SHUT_WR) çağırın. Bu, xidmətə doğru sonrakı ötürməni bitirir, xidmətdən müştəriyə istiqaməti isə əlçatan saxlayır. Xidmət cavabını bitirdikdə, cavab növbəsini boşaltdıqdan sonra güzgü əməliyyatını tətbiq edin.

Deskriptorların bağlanması hər iki istiqamətin və onların gözləyən buferlərinin bitdiyi yerə, ya da xəta və ləğvetmənin sonlandırma tələb etdiyi yerə aiddir. Qalan yarısını heç vaxt tamamlamayan peer üçün məhdud timeout saxlayın.

Hazırlıq oxumağa dəvətdir

Oxuna bilən soketdə məlumat və ya EOF vəziyyəti ola bilər. recv çağırın və nəticəsini şərh edin. Müsbət saylar ötürüləcək baytlardır; sıfır istiqamətin sonudur. Bloklamayan soketdə EAGAIN və ya EWOULDBLOCK hazırda daha çox giriş olmadığını bildirir, EINTR isə yenidən cəhd tələb edə bilər. Heç biri EOF ilə eyni hadisə deyil.

Qaytarılan bayt buferində FIN bayrağı axtarmayın. TCP bu API-yə nizamlı bayt axını çatdırır; paket sərhədləri və FIN seqmenti adi tətbiq yükü deyil.

Bu, xam bayt tunelinin həyat dövrüdür. Mesajları təhlil edən HTTP proksisi yenə də HTTP çərçivələnməsinə riayət etməlidir, TLS-i sonlandıran proksisin də TLS bağlanma protokolu var. Bu protokol qərarlarını istiqamətli TCP relay-dən yuxarıda saxlayın.

Əlaqəli məqalələr