Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Помогите разобратся с исходником Socks4 сервера.


Автор: nod3264 21.10.2009, 11:52
Нашол исходники socks 4 сервера. 

Код


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,si  zeof(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.


Сохранил этот код в файду socks4.dpr 

Запустил, скомпилировал. Закинул прогу на деда, запустил. Пытаюсь зайти через него на 2ip.ru или google.com но ничего не выходит, браузер ругается "Время ожидания ответа от сервера 2ip.ru истекло.".


Настройки точно верные в браузере, так как с покупного сокса который мне дал товарищ для тестов всё грузится хорошо. 


В чём проблема?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)