Ракување со EOF во Python SOCKS циклус за читање
Ракувајте со EOF експлицитно во SOCKS циклус за точно читање наместо затворена врска да ја третирате како истек на време што никогаш не доаѓа.
Еден циклус сака осум бајти од SOCKS одговор. Примил е три. Следното читање враќа b'', циклусот го додава, ја проверува должината и обидува повторно засекогаш.
Тоа е грешка во ракувањето со EOF, а не бавен прокси на кој му треба подолг истек на време. При нормално примање преку струен сокет, празен бајт-стринг значи дека другата страна се исклучила. Останатите пет бајти нема да пристигнат преку таа врска.
Помошникот за точно читање бара три различни исходи: акумулирање на непразни делови, неуспех при EOF пред потребната должина и пренесување на истекот на време или друга грешка на сокетот. Тие случаи не треба да се слеат во еден општ циклус за повторување.
Поставете го предвидениот истек на време на сокетот пред операцијата и читајте ги должините на полињата што ги одредува протоколот на проксито. Едно примање може да врати само дел од одговорот. Обратно, барањето голем фиксен бафер не прави секоја SOCKS адреса да има таква должина.
Не поправајте зависност со вметнување стар MSG_WAITALL исечок во нејзиниот извор и претпоставка дека ги покрива EOF, сигналите и однесувањето на платформата. Претпочитајте ја поддржаната поправка на одржуваната имплементација или намерно имплементирајте го договорот на помошникот кога парсерот е ваш код.
Задржете колку бајти биле очекувани и примени, без евидентирање на товари со акредитиви. „EOF по три од осум бајти одговор“ го објаснува расипаниот размен многу подобро од „проксито повторно закочи“.