Обработка на EOF в цикъл за четене на SOCKS в Python
Обработвайте EOF изрично в цикъл за точно четене на SOCKS, вместо да приемате затворена връзка като таймаут, който никога не идва.
Един цикъл иска осем байта от отговора на SOCKS. Получил е три. Следващото четене връща b'', цикълът го добавя, проверява дължината и опитва отново безкрайно.
Това е грешка при обработката на EOF, а не бавен прокси, който се нуждае от по-дълъг таймаут. При нормално получаване през потоков сокет празният байтов низ означава, че партньорът се е разкачил. Останалите пет байта няма да пристигнат по тази връзка.
Помощникът за точно четене се нуждае от три различни изхода: натрупване на непразни части, грешка при EOF преди необходимата дължина и предаване на таймаут или друга грешка на сокета. Тези случаи не трябва да се сливат в един общ цикъл за повторни опити.
Задайте предвидения таймаут на сокета преди операцията и четете дължините на полетата, зададени от протокола на проксито. Едно получаване може да върне само част от отговора. Обратно, искането на голям фиксиран буфер не прави всеки SOCKS адрес с тази дължина.
Не поправяйте зависимост, като поставите стар фрагмент MSG_WAITALL в изходния ѝ код и приемете, че покрива EOF, сигнали и поведение на платформата. Предпочитайте поддържаната поправка в поддържаната реализация или съзнателно приложете договора на помощника, когато парсерът е ваш код.
Запазвайте колко байта са очаквани и получени, без да записвате полезни товари с идентификационни данни. „EOF след три от осем байта на отговора“ обяснява счупения обмен много по-добре от „проксито отново увисна“.