Клијент завршава слање, прокси види 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 релеја.

Повезани чланци