Пренесување на полузатворање на 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 реле.