Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2007, 15:37   #1
XoTTa6bI2
 
Регистрация: 05.04.2007
Сообщений: 3
По умолчанию http, socks5 proxy с подсчетом пропускаемого траффа

Помогите написать на делфи http, socks5 proxy с подсчетом пропускаемого траффа:
Что он должен делать?
-проксировать http и https трафик
-проксировать socks 5 с возможной авторизацией.
-cчитать сколько байт отправлено и получено с какого IP и какому клиенту передано через проксю

Примечание
действовать это должно так. Стоит прокся в сети, открыти порты 8080 под хттп и 1080 под сокс.
В сетке на компьюетрах в браузере прописываешь "работай через прокси" и айпишник сервера и порт соответсвенно. Всё. трафф должен пойти через прокси а там посчитаться.

Кто поможет реализовать буду очень благодарен.
XoTTa6bI2 вне форума Ответить с цитированием
Старый 05.04.2007, 15:43   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Бюджет описывайте.
В работу для программистов.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 05.04.2007, 15:59   #3
XoTTa6bI2
 
Регистрация: 05.04.2007
Сообщений: 3
По умолчанию

Прошу помочь, а не написать за деньги.
XoTTa6bI2 вне форума Ответить с цитированием
Старый 05.04.2007, 17:15   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

молодцы, однако.
Помогите сделать с нуля...
Alar вне форума Ответить с цитированием
Старый 06.04.2007, 12:58   #5
XoTTa6bI2
 
Регистрация: 05.04.2007
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
молодцы, однако.
Помогите сделать с нуля...
Не с нуля вот что у меня есть
Код:
program dproxy;

uses
  windows,
  WinSock;

type TSOCKS4_REQUEST=record
       ucVersion : byte;
       ucCommand : byte;
       wDestPort : word;
       dwDestIp  : dword;
     end;

var
  wsaData : TWSADATA;
  sport   : string;
  iport   : word;
  l_sock  : TSocket;
  sock4   : SOCKADDR_IN;
  Client  : TSockAddr;
  Size    : integer;
  h1      : THandle;


procedure FlushRecvBufferUntil(s:TSOCKET;condition:Char);
var
  iReceiveRes : integer;
  cDummy      : char;
begin
  repeat
    iReceiveRes := recv(s, cDummy, sizeof(cDummy), 0);
  until NOT ((iReceiveRes<>SOCKET_ERROR) and (iReceiveRes<>0) and (cDummy<>condition));
end;

procedure SocksHandlerTreadProc(pParam:pointer); stdcall;
var
  s              : TSocket;
  tunnelSock     : TSocket;
  iConnectResult : integer;
  iReceiveRes    : integer;
  iSocketsSet    : integer;
  socks4Request  : TSOCKS4_REQUEST;
  socks4Response : TSOCKS4_REQUEST;
  remoteAddr     : SOCKADDR_IN;
  fds_read       : TFDset;//fd_set;
  tv             : TTimeval;
  cSocksVersion  : byte;
  iSelectResult  : integer;
  loop           : integer;
  ulVal          : u_long;
  swapBuffer     : array[0..4096*16-1] of char;
  iRecvResult    : integer;
begin
  s              := TSOCKET(pParam);
  tunnelSock     := 0;
  loop           := 0;
  while loop=0 do
  begin
    inc(loop);
    iConnectResult := 0;
    iReceiveRes    := 0;
    iSocketsSet    := 0;
    FD_ZERO(fds_read);
    FD_SET(s, fds_read);
    tv.tv_sec     := 30;
    cSocksVersion := 0;
    iSelectResult := select(0, @fds_read, nil, nil, @tv);
    if (iSelectResult=SOCKET_ERROR) or (not iSelectResult>0) then break;
    ulVal := 0;
    ioctlsocket(s, FIONBIO , ulVal);
    iReceiveRes := recv(s, cSocksVersion, 1, MSG_PEEK);
    if cSocksVersion=4 then // 3333333333333333333
    begin
      iReceiveRes := recv(s, socks4Request, sizeof(socks4Request), 0);
      if iReceiveRes=SOCKET_ERROR then break;
      ulVal := 1;
      ioctlsocket(s, FIONBIO , ulVal);
      FlushRecvBufferUntil(s, #0);
      if socks4Request.ucCommand = 1 then
      begin // 2222222222222222222
    ulVal := 0;
    ioctlsocket(s, FIONBIO, ulVal);
    remoteAddr.sin_family := AF_INET;
    move(socks4Request.dwDestIp,remoteAddr.sin_addr,sizeof(remoteAddr.sin_addr));
    remoteAddr.sin_port := socks4Request.wDestPort;
    tunnelSock := socket(AF_INET, SOCK_STREAM, 0);
    iConnectResult := connect(tunnelSock, remoteAddr, sizeof(remoteAddr));
    if (iConnectResult<>SOCKET_ERROR) then
    begin // 1111111111
      socks4Response.ucCommand := 90;
      socks4Response.ucVersion := 0;
      send(s, socks4Response, sizeof(socks4Response), 0);
    end else break; // 1111111111
      end else break;// 2222222222222222222
    end else break;// 3333333333333333333
    ulVal := 0;
    ioctlsocket(tunnelSock, FIONBIO, ulVal);
    ioctlsocket(s, FIONBIO, ulVal);
    fillchar(swapBuffer,sizeof(swapBuffer),0);
    tv.tv_sec := 2;
    while true do // 4444444444444444
    begin
      FD_ZERO(fds_read);
      FD_SET(s, fds_read);
      FD_SET(tunnelSock, fds_read);
      iSocketsSet := select(0, @fds_read, nil, nil, @tv); //if (iSocketsSet == SOCKET_ERROR) _leave;
      if iSocketsSet > 0 then // 5555555555555555
      begin
    if FD_ISSET(s, fds_read) then
    begin
      iRecvResult := recv(s, swapBuffer, sizeof(swapBuffer), MSG_PEEK);
      if (iRecvResult=0)
        then break
        else iRecvResult := recv(s, swapBuffer, sizeof(swapBuffer), 0);
      if (iRecvResult <> SOCKET_ERROR) and (iRecvResult > 0)
        then send(tunnelSock, swapBuffer, iRecvResult, 0)
        else BREAK;
    end;

    if (FD_ISSET(tunnelSock, fds_read)) then
    begin
      iRecvResult := recv(tunnelSock, swapBuffer, sizeof(swapBuffer), MSG_PEEK);
      if iRecvResult = 0
        then break
        else iRecvResult := recv(tunnelSock, swapBuffer, sizeof(swapBuffer), 0);
      if (iRecvResult <> SOCKET_ERROR) and (iRecvResult > 0)
        then send(s, swapBuffer, iRecvResult, 0)
        else break;
    end;
      end;  // 5555555555555555
    end; // 4444444444444444
  end; // while loop=0 do
  closesocket(s);
  closesocket(tunnelSock);
end;

begin
  WSAStartup(MAKEWORD(2,0), wsaData);
  l_sock                := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  sock4.sin_family      := AF_INET;
  sock4.sin_port        := htons(1080);
  sock4.sin_addr.s_addr := INADDR_ANY;
  Size                  := SizeOf(Client);
  if (Bind(l_sock,sock4,SizeOf(sock4))=0) and (Listen(l_sock,$FF)=0) then
    while true do CreateThread(nil,0,@SocksHandlerTreadProc,Pointer(accept(l_sock, @Client, @Size)),0,h1);
end.
XoTTa6bI2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
idIRC + proxy [Pr1_Zr4k] Работа с сетью в Delphi 1 28.05.2008 22:51
Proxy в WinSock SHEI'TI Работа с сетью в Delphi 3 29.03.2008 18:27
Proxy Paranoic Свободное общение 1 08.06.2007 08:48
socks,proxy... -=DeS=- Свободное общение 16 21.05.2007 14:51
Proxy Veytarn Свободное общение 6 17.12.2006 01:24