/*
  Socks5 IPv4/IPv6 сервер без поддержки аутентификации.

  Примечание: при команде BIND входящее соединение ожидается SOCKS5_BIND_TIMEOUT миллисекунд.
*/
#pragma once

namespace Socks5Server
{
  /*
    Инициализация.
  */
  void init(void);

  /*
    Деинициализация.
  */
  void uninit(void);
  
  /*
    Запуск сессии Socks 4 (версия читается из сокета до вызова).
    
    IN s       - сокет, после окончания сессиии сокет НЕ будет закрыт.
    IN timeout - таймаут сокета в миллисекундах, 0 для неограниченого ожидания.

    Return     - true - в случаи проведения сессии без ошибок протокола и обрывов связи,
                 false - в случаи возникновения ошибок в протоколе или обрывов связи.
  */
  bool _start5(SOCKET s, DWORD timeout);

  /*
    Запуск сессии Socks 5 (версия читается из сокета до вызова).
    
    IN s       - сокет, после окончания сессиии сокет НЕ будет закрыт.
    IN timeout - таймаут сокета в миллисекундах, 0 для неограниченого ожидания.

    Return     - true - в случаи проведения сессии без ошибок протокола и обрывов связи,
                 false - в случаи возникновения ошибок в протоколе или обрывов связи.
  */
  bool _start4(SOCKET s, DWORD timeout);

  /*
    Запуск сессии Socks с авто определнием.
    
    IN s       - сокет, после окончания сессиии сокет будет закрыт.
    IN timeout - таймаут сокета в миллисекундах, 0 для неограниченого ожидания.

    Return     - true - в случаи проведения сессии без ошибок протокола и обрывов связи,
                 false - в случаи возникновения ошибок в протоколе или обрывов связи.
  */
  bool _start(SOCKET s, DWORD timeout);
};
