Χειρισμός του EOF σε βρόχο ανάγνωσης SOCKS σε Python
Χειριστείτε το EOF ρητά σε βρόχο ακριβούς ανάγνωσης SOCKS αντί να θεωρείτε μια κλειστή σύνδεση ως λήξη χρόνου που δεν έρχεται ποτέ.
Ένας βρόχος θέλει οκτώ byte από μια απάντηση SOCKS. Έχει λάβει τρία. Η επόμενη ανάγνωση επιστρέφει b'', ο βρόχος το προσθέτει, ελέγχει το μήκος και ξαναπροσπαθεί για πάντα.
Αυτό είναι σφάλμα χειρισμού EOF, όχι αργό proxy που χρειάζεται μεγαλύτερη λήξη χρόνου. Σε κανονική λήψη μέσω socket ροής, μια κενή συμβολοσειρά byte σημαίνει ότι ο ομότιμος αποσυνδέθηκε. Τα υπόλοιπα πέντε byte δεν θα φτάσουν σε αυτή τη σύνδεση.
Ένας βοηθός ακριβούς ανάγνωσης χρειάζεται τρία διακριτά αποτελέσματα: συσσώρευση μη κενών τμημάτων, αποτυχία σε EOF πριν από το απαιτούμενο μήκος και μεταβίβαση λήξης χρόνου ή άλλου σφάλματος socket. Αυτές οι περιπτώσεις δεν πρέπει να συγχωνεύονται σε έναν γενικό βρόχο επανάληψης.
Ορίστε την προβλεπόμενη λήξη χρόνου του socket πριν από τη λειτουργία και διαβάστε τα μήκη πεδίων που καθορίζει το πρωτόκολλο του proxy. Μία μόνο λήψη μπορεί να επιστρέψει μόνο μέρος μιας απάντησης. Αντίστροφα, το αίτημα για μεγάλο σταθερό buffer δεν κάνει κάθε διεύθυνση SOCKS να έχει αυτό το μήκος.
Μην επισκευάζετε μια εξάρτηση επικολλώντας ένα παλιό απόσπασμα MSG_WAITALL στον πηγαίο κώδικά της και υποθέτοντας ότι καλύπτει EOF, σήματα και συμπεριφορά πλατφόρμας. Προτιμήστε τη υποστηριζόμενη διόρθωση της συντηρούμενης υλοποίησης ή υλοποιήστε σκόπιμα το συμβόλαιο του βοηθού όταν ο αναλυτής είναι δικός σας κώδικας.
Κρατήστε πόσα byte αναμένονταν και ελήφθησαν, χωρίς να καταγράφετε φορτία διαπιστευτηρίων. Το «EOF μετά από τρία από οκτώ byte απάντησης» εξηγεί την χαλασμένη ανταλλαγή πολύ καλύτερα από το «το proxy κόλλησε ξανά».