Свързването на TCP сокет на Asio със слушател на SOCKS5 изпълнява една стъпка: TCP връзката към този слушател. То не кара проксито да се свърже с крайния сървър. За разрешен тест с публична цел списъкът с SOCKS5 проксита предлага кандидати за тази първа TCP крайна точка; конекторът все още трябва да изпълни обмена по-долу.

След това конекторът на SOCKS5 трябва да изпълни обмена на протокола:

  1. Изпратете поздрав с версия 5, изброяващ методите за удостоверяване, които клиентът поддържа.
  2. Прочетете избрания метод и изпълнете неговия обмен за удостоверяване, когато се изисква.
  3. Изпратете CONNECT с типа адрес на дестинацията, адреса и порта в мрежов байтов ред.
  4. Прочетете отговора, проверете версията и кода на резултата, и изчерпете пълния свързан адрес и порт с променлива дължина.
  5. Предайте установения поток на протокола на приложението.

Помощник с име socks5::async_proxy_connect принадлежи на SOCKS реализацията, която предоставя този помощник. Назоваването му до boost::asio не го прави част от TCP сокет интерфейса на Asio.

TCP четенията могат да върнат само част от отговора. Съставете четения за нужните бройки байтове, след което изберете оставащата дължина от полето за тип адрес. Не предполагайте, че всеки отговор на сървър има фиксираното IPv4 оформление.

За HTTPS изпълнете TLS ръкостискането към дестинацията след успешен SOCKS CONNECT, запазвайки SNI на дестинацията и проверката на името на хоста. Успешният отговор на проксито сам по себе си не удостоверява уебсайта.

Запазете отмяната и крайните срокове през цялата последователност на настройка. Ако времето за установяване на TCP връзката изтече, следващите обмени на поздрав, удостоверяване и CONNECT остават без ограничение.

Подобни статии