SOCKS релесіндегі толық дуплексті ағын және кері қысым
Реле ағынын болжамды жауап өлшемдерінің орнына тәуелсіз байт ағындары, ішінара I/O, шектелген буферлер және кері қысым негізінде жобалаңыз.
SOCKS қол алысуы сәтті аяқталды. Енді реле клиенттен оқиды, межеге жазады, толық жауапты күтеді, содан кейін ғана клиенттен қайта оқиды. Бұл реттілік мүлдем дұрыс қолданбаны тұйықтауы мүмкін.
TCP туннелі орнатылғаннан кейін SOCKS оның ішіндегі хабарламаларды анықтамайды. Меже бірінші жіберуі мүмкін. Екі жақ та тәуелсіз жібере алады. Бір жақ қысқа жазба жіберіп, содан кейін екінші жақтың жауабын күтуі мүмкін.
Байттарды жеткізіңіз, болжамды транзакцияларды емес
Қабылдау шақыруы өз жалаушалары мен сокет күйіне сәйкес қолжетімді байттарды қайтарады. Ол жалпы релеге қолданба жауабының толық екенін айтпайды. Кездейсоқ үлкен буфердің толуын күту серіктеске жалғастыру үшін қажет шағын хабарламаны жіберуге кедергі келтіруі мүмкін.
Екі бағытқа да қызмет ету үшін қолданбаның бар параллельдік моделін пайдаланыңыз: оқиғалар циклі, асинхронды I/O немесе әдейі таңдалған басқа дизайн. Маңыздысы — бір бағыттағы ілгерілеу екіншісінде ойдан шығарылған хабарлама шекарасын талап етпейді.
Екі шектелген күту буферін ұстаңыз
Клиенттен оқылған деректер әлі де межеге жетуді күтіп тұруы мүмкін, ал межеден келген деректер клиентке жетуді күтеді. Осы күту байттарын бөлек бақылаңыз.
Жіберу сұралғаннан аз байт жазуы мүмкін. Жазылмаған бөлігін сақтаңыз; оны тастамаңыз және бүкіл буферді қайта ойнатпаңыз. Уақытша жазылмайтын сокет дұрыс дайындық оқиғасын күтуге себеп, үздіксіз айналуға емес.
Буферлерді шектеңіз. Егер меже баяу болса, шексіз клиент деректерін оқуды жалғастыру кезекті реле жадысына ғана жылжытады. Кері қысым — сәйкес күту буфері толғанда оқуды тоқтатып, жазу орын босатқанда қайта бастау.
Бір бағыттағы аяқталу саясатты қажет етеді
TCP жіберу бағытын жабуы мүмкін, ал екінші бағытта әлі пайдалы деректер бар. Буферленген байттар таусылғаннан кейін бұл күйді қалай жеткізу керегін шешіңіз және ретті жабылуды қатеден немесе мерзімнен ажыратыңыз.
Мұның ешқайсысы реледен қолданбаның пайдалы жүктемесін шифрдан шығаруды немесе талдауды талап етпейді. Оған ағынды дұрыс өңдеу қажет. Тек буфер өлшемін ұлғайту қате жақты күтетін немесе әр оқуды бір толық сұранысқа сәйкес деп есептейтін релені түзете алмайды.