유효한 프록시 주소가 있어도 손으로 작성한 SOCKS 메시지가 유효해지지는 않습니다. C나 C++ 구조체를 보내면 프로토콜이 요구한 적 없는 패딩이나 호스트 순서의 정수가 함께 전송될 수 있습니다.

SOCKS5 도메인 이름 CONNECT 요청에서는 메서드 협상과 선택된 인증이 끝난 뒤 이 순서를 명시적으로 직렬화하세요.

  1. 버전, 명령, 예약 바이트, 주소 유형
  2. 도메인 길이와 도메인 바이트
  3. 네트워크 바이트 순서의 2바이트 목적지 포트

주소 길이는 SOCKS 버전과 주소 유형에 따라 달라집니다. 고정 폭 숫자 필드는 지정된 표현이 필요하고, 도메인 문자열은 자체 길이 인코딩을 가집니다. C 문자열 종료 문자는 와이어 메시지에 0을 덧붙이라는 일반 지시가 아닙니다.

구현 지름길확인해야 할 문제
8비트 포인터를 통해 32비트 값 대입4바이트를 모두 내보내지 않음
버퍼를 더 큰 정수 포인터로 캐스팅정렬과 바이트 순서를 여전히 처리해야 함
한 번의 읽기나 쓰기가 한 메시지라고 가정TCP는 프로토콜 순서의 일부만 전송할 수 있음

각 필드를 의도한 목적지와 비교하고 부분 I/O를 처리하세요. 2바이트를 받았다고 응답 전체가 도착한 것은 아닙니다. 그 경계를 살펴보면 잘못된 요청과 올바르게 설명된 연결을 거부하는 서버를 구분할 수 있습니다.

관련 글