Java SOCKS 주소의 음수는 음수 IP가 아니다
Java byte API로 SOCKS 주소 필드를 파싱할 때는 부호 없는 프로토콜 값으로 읽으십시오.
Java에서 byte는 부호가 있습니다. 따라서 전선상 값이 217인 옥텟은 byte 배열에서 직접 출력할 때 음수 값으로 보일 수 있습니다. 이것은 프록시가 잘못된 음수 IP 주소를 보냈다는 뜻이 아닙니다.
저장된 값을 부호 없는 정수로 변환하십시오. 예를 들어 Byte.toUnsignedInt(value)를 사용하거나, 필드를 읽을 때 DataInputStream.readUnsignedByte()를 사용하십시오. 네트워크 바이트 순서의 포트는 두 바이트 중 하나를 부호 있는 십진수로 취급하지 말고 문서화된 2바이트 값을 읽어야 합니다.
표현과 프레이밍도 분리하십시오. 소켓 읽기는 요청한 것보다 적은 바이트를 반환할 수 있습니다. 필드 전체를 읽은 다음 SOCKS 버전과 주소 유형에 따라 해석하십시오. SOCKS5 주소에는 IPv4 주소, IPv6 주소 또는 길이 접두사가 붙은 도메인 이름이 들어갈 수 있습니다. 고정된 4바이트 가정은 그중 한 형태만 처리합니다.
음수처럼 보이는 옥텟을 고치면 표시 문제는 해결됩니다. 그러나 잘못된 오프셋에서 읽기 시작했거나 주소 중간에서 멈춘 파서는 고쳐지지 않습니다.