type
ip = array [1..4] of byte;

    Odpowiadam = packed record
                ver      : byte;
                rep      : byte;
                rsv      : byte;
                atyp     : byte;
                ipaddr   : ip;
                port     : word;
    end;

    SOCKSDataType = packed record
                ver      : byte;
                cmd      : byte;
                rsv      : byte;
                atyp     : byte;
                destip   : ip;
                port     : word;
    end;

       witam = packed record
                ver      : byte;
                method   : byte;
                nmethod  : byte;
    end;

    cze = packed record
                ver      : byte;
                method   : byte;
    end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.serverExecute(AThread: TIdPeerThread);
var
NewCommBlock : witam;
odpowiedz : cze;
Pakiet : SOCKSDataType;
Pakiet4U : Odpowiadam;
mojeip : ip;
numerip :  String;
begin
    odpowiedz.ver:=5;
    odpowiedz.method:=0;
    AThread.Connection.ReadBuffer (NewCommBlock, SizeOf (NewCommBlock));

    memo1.Lines.Add('Versia : ' +inttostr(newcommblock.ver));
    memo1.Lines.Add('Metoda : '+inttostr(newcommblock.method));
    memo1.Lines.Add('');

    AThread.Connection.WriteBuffer(odpowiedz, sizeof (odpowiedz), true);
    AThread.Connection.ReadBuffer (Pakiet, SizeOf (Pakiet));
    numerip:=inttostr(pakiet.destip[1])+'.'+inttostr(pakiet.destip[2])+'.'+inttostr(pakiet.destip[3])+'.'+inttostr(pakiet.destip[4]);

    memo1.Lines.Add('Versia : '+inttostr(pakiet.ver));
    memo1.Lines.Add('Command: '+inttostr(pakiet.cmd));
    memo1.Lines.Add('RSV: '+inttostr(pakiet.rsv));
    memo1.Lines.Add('AType: '+inttostr(pakiet.atyp));
    memo1.Lines.Add('IP : '+numerip);
    memo1.Lines.Add('Port : '+inttostr(pakiet.port));
    memo1.Lines.Add('');

    tunel.MappedHost:=numerip;
    tunel.MappedPort:=pakiet.port div 256;
    mojeip[1]:=127;
    mojeip[2]:=0;
    mojeip[3]:=0;
    mojeip[4]:=1;
    pakiet4u.ver:=5;
    pakiet4u.rep:=0;
    pakiet4u.rsv:=0;
    pakiet4u.atyp:=1;
    pakiet4u.ipaddr:=mojeip;
    pakiet4u.port:=5*256;

    memo1.Lines.Add('Versia : '+inttostr(pakiet4u.ver));
    memo1.Lines.Add('Reply: '+inttostr(pakiet4u.rep));
    memo1.Lines.Add('RSV: '+inttostr(pakiet4u.rsv));
    memo1.Lines.Add('AType: '+inttostr(pakiet4u.atyp));
    memo1.Lines.Add('IP : 127.0.0.1');
    memo1.Lines.Add('Port : '+inttostr(pakiet4u.port div 256));
    memo1.Lines.Add('');

    AThread.Connection.WriteBuffer(pakiet4u, sizeof (pakiet4u), true);
end;

procedure TForm1.tunelExecute(AThread: TIdMappedPortThread);
begin
memo2.Lines.Add(TIdMappedPortThread(AThread).NetData);
end;

procedure TForm1.tunelOutboundData(AThread: TIdMappedPortThread);
begin
memo2.Lines.Add(TIdMappedPortThread(AThread).NetData);
end;

end.

Server to TIdTCPServer, a tunel to TIdMappedPortTCP. Po wysłaniu do klienta pakietu "Pakiet4U", klient powiniem nawiązać połaczenie z 127.0.0.1:5 i normalnie wysyłac dane. Przynajmniej tak mi sie wydaje po przeczytaniu http://www.faqs.org/rfcs/rfc1928.html. Jednak klient (w moim przypadku putty) nie robi nic, nie łaczy sie z 127.0.0.1:5 ani nie wysyla zadnych innych danych. Może ktoś pisał juz server Socks 5 i powie co jest nie tak ? A może ktoś jest tak miły i się zainteresuje moim problemem przy okazji poszezając swoją wiedze :P?? To nie ma być jakis rozbudowany server Socks ktory obsługiwał by wszystkie metody (user i hasło) tylko takie małe coś, byle by działalo :)