W Javie byte jest ze znakiem. Dlatego oktet, którego wartość w sieci wynosi 217, może pojawić się jako wartość ujemna przy bezpośrednim wydruku z tablicy bajtów. Nie oznacza to, że proxy wysłało nieprawidłowy ujemny adres IP.

Przekonwertuj zapisaną wartość na liczbę całkowitą bez znaku, na przykład za pomocą Byte.toUnsignedInt(value), albo użyj DataInputStream.readUnsignedByte() podczas odczytu pola. Dla portu w kolejności sieciowej odczytaj udokumentowaną wartość dwubajtową, zamiast traktować którykolwiek bajt jako dziesiętną liczbę ze znakiem.

Oddziel też reprezentację od ramkowania. Odczyt z gniazda może zwrócić mniej bajtów, niż zażądano. Odczytaj całe pole, a następnie zinterpretuj je zgodnie z wersją SOCKS i typem adresu. Adresy SOCKS5 mogą zawierać adres IPv4, adres IPv6 lub nazwę domeny z prefiksem długości; stałe założenie czterech bajtów obejmuje tylko jedną z tych form.

Poprawienie oktetu, który wygląda na ujemny, rozwiązuje problem wyświetlania. Nie naprawia jednak parsera, który zaczął czytać pod złym przesunięciem lub zatrzymał się w połowie adresu.

Powiązane artykuły