Java에서 byte는 부호가 있습니다. 따라서 전선상 값이 217인 옥텟은 byte 배열에서 직접 출력할 때 음수 값으로 보일 수 있습니다. 이것은 프록시가 잘못된 음수 IP 주소를 보냈다는 뜻이 아닙니다.

저장된 값을 부호 없는 정수로 변환하십시오. 예를 들어 Byte.toUnsignedInt(value)를 사용하거나, 필드를 읽을 때 DataInputStream.readUnsignedByte()를 사용하십시오. 네트워크 바이트 순서의 포트는 두 바이트 중 하나를 부호 있는 십진수로 취급하지 말고 문서화된 2바이트 값을 읽어야 합니다.

표현과 프레이밍도 분리하십시오. 소켓 읽기는 요청한 것보다 적은 바이트를 반환할 수 있습니다. 필드 전체를 읽은 다음 SOCKS 버전과 주소 유형에 따라 해석하십시오. SOCKS5 주소에는 IPv4 주소, IPv6 주소 또는 길이 접두사가 붙은 도메인 이름이 들어갈 수 있습니다. 고정된 4바이트 가정은 그중 한 형태만 처리합니다.

음수처럼 보이는 옥텟을 고치면 표시 문제는 해결됩니다. 그러나 잘못된 오프셋에서 읽기 시작했거나 주소 중간에서 멈춘 파서는 고쳐지지 않습니다.

관련 글