Главная страница


ru.nethack

 
 - RU.NETHACK -------------------------------------------------------------------
 From : Anton Fedorov                        2:5000/111.33  04 Nov 2002  19:53:58
 To : Andrew Nikolaev
 Subject : Re: Http тунель
 -------------------------------------------------------------------------------- 
 
 
 Воскресенье Hоябрь 03 2002 14:51, Andrew Nikolaev НН. Anton Fedorov:
 
  SR>>> Подскажите кто нибудь как оpганизовать сабж.
  AF>> если есть CONNECT метод, то подняв y себя слyшалкy на нyжном
  AF>> поpтy, по коннектy на нее посылать CONNECT хост:поpт
  AF>> HTTP/1.1\n\n, дождаться CONNECTED и поднять соединение.
  AF>>     я так делаю.
  AN> а можно еще подробнее? - совсем для ламеров?
 
     можно. действия:
  list = createsocket
  bint ( list, listport )
 
  while (1) {
 
    listen(list)
    client = accept(list)
    server = createsocket
    connect(server, address(serveraddr, serverport))
    createthread(serverthread, {server, client})
    createthread(clientthread, {client, server})
 
  }
 
     где
 
  serverthread (server, client){
    send(server,'CONNECT tunnelhost:tunnelport HTTP/1.1')
    recv(server,'HTTP/1.'[0;1]' 200')
    while (1) {
      recv(server, buf)
      if error {
        close(server)
        close(client)
        exit
      }
      send(client, buf)
      if error {
        close(server)
        close(client)
        exit
      }
    }
  }
 
     а
  clientthread (client, server){
    while (1) {
      recv(client, buf)
      if error {
        close(client)
        close(server)
        exit
      }
      send(server, buf)
      if error {
        close(client)
        close(server)
        exit
      }
    }
  }
 
  AN> и с примером
 
     бpp. тyннель каким я пользyюсь на pаботе, но накидал вот :) за качество
 кода не пинать - десятиминyтки в пpинципе не вылизываю. подсветочкy
 pекоммендyется в голдеде отpyбить.
 
 ps: писалось под vp 2.1
 ЪДДДДДДДДДДДДДДДДДДДДДДД. ГРЫЗИ  tunnel.pas .ДДДДДДДДДДДДДДДДДДДДДДДї
 uses windows, winsock, sysutils;
 
 const LISTEN_PORT=3128;       // Port for listen on
 const CONNECT_TO='localhost'; // Proxy address
 const CONNECT_PORT=80;        // Proxy port
 const TUNNEL_TO='localhost';  // Address for tunnel to
 const TUNNEL_PORT='21';       // Port for tunnel to
 
 var ClSock: TSOCKET;
     SrSock: TSOCKET;
     Event:  Handle;
 function ServerProc(a: pointer): longint; stdcall;
 var Clnt, Serv: TSocket;
     Buffer: array[-3..1023] of char;
     retval: longint;
     B: longint; i: integer;
 
   procedure CloseConnect;
   begin
     WSAGetLastError;
     CloseSocket(Serv); WSAGetLastError;
     CloseSocket(Clnt); WSAGetLastError;
     ExitThread(0);
   end;
 
 begin
   Clnt:=ClSock; PWord(@Buffer)^:=0;
   Serv:=SrSock;
   B:=-1;
   PulseEvent(Event);
   lstrcpy(@Buffer[0], 'CONNECT '+TUNNEL_TO+':'+TUNNEL_PORT+
                       ' HTTP/1.1'#13#10#13#10);
   retval := send(serv,Buffer[0],lstrlen(@Buffer[0]),0);
   if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect;
   while true do begin
     retval := recv(serv,Buffer[0],sizeof (Buffer),0 );
     if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect;
     if b<0 then
       if (PLongint(@Buffer[0])^=$50545448{HTTP}) and
          (PLongint(@Buffer[8])^=$30303220{ 200}) then b:=2
       else begin
         send(clnt, Buffer[0], retval, 0);
         CloseConnect;
       end;
     if b>0 then begin
       for i:=0 to retval do
         if ((Buffer[i-3]=#$0D) and (Buffer[i-2]=#$0A) and
             (Buffer[i-1]=#$0D) and (Buffer[i  ]=#$0A)) or
            ((Buffer[i-3]=#$0A) and (Buffer[i-2]=#$0D) and
             (Buffer[i-1]=#$0A) and (Buffer[i  ]=#$0D)) or
            ((Buffer[i-1]=#$0D) and (Buffer[i  ]=#$0D)) or
            ((Buffer[i-1]=#$0A) and (Buffer[i  ]=#$0A))
         then begin
           dec(retval, i+1);
           move(Buffer[i+1], Buffer[0], retval);
           b:=0;
           break
         end;
       if b>0 then move(Buffer[retval-3], Buffer[0], 3);
     end;
     if (b=0) and (retval>0) then begin
       retval := send(clnt,Buffer[0],retval,0);
       if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect;
     end;
   end;
 end;
 
 function ClientProc(a: pointer): longint; stdcall;
 var Clnt, Serv: TSocket;
     Buffer: array[0..1023] of char;
     retval: longint;
 
   procedure CloseConnect;
   begin
     WSAGetLastError;
     CloseSocket(Clnt);WSAGetLastError;
     CloseSocket(Serv);WSAGetLastError;
     ExitThread(0);
   end;
 
 begin
   Clnt:=ClSock;
   Serv:=SrSock;
   PulseEvent(Event);
   while true do begin
     retval := recv(clnt,Buffer,sizeof(Buffer),0 );
     if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect;
     retval := send(serv,Buffer,retval,0);
     if (retval = SOCKET_ERROR) or (retval=0) then CloseConnect;
   end;
 end;
 
 var
   th: longint;
   retval: longint;
   fromlen: longint;
   i: longint;
   local, from, connect_addr: tsockaddrin;
   wsa: TWSADATA;
   listen_socket: TSOCKET;
   t: text;
   h: phostent;
 begin
   try
     RegisterServiceProcess(0,1);
     if (WSAStartup($202,wsa) = SOCKET_ERROR) then exit;
 
     Event:=CreateEvent(nil, false, false, nil);
 
     connect_addr.sin_family := AF_INET;
     connect_addr.sin_addr.s_addr := inet_addr(CONNECT_TO);
     if connect_addr.sin_addr.s_addr=INADDR_NONE then begin
       h:=gethostbyname(CONNECT_TO);
       connect_addr.sin_addr.s_addr:=plongint(h^.h_addr_list^)^;
     end;
     connect_addr.sin_port := htons(CONNECT_PORT);
 
     fillchar(local, sizeof(local), 0);
     local.sin_family := AF_INET;
     local.sin_addr.s_addr := INADDR_ANY;
     local.sin_port := htons(LISTEN_PORT);
     listen_socket := socket(AF_INET, SOCK_STREAM,0); // TCP socket
     if (listen_socket = INVALID_SOCKET) then exit;
     if (bind(listen_socket,local,sizeof(local))= SOCKET_ERROR) then exit;
 
     assign(T, 'leftmans.log');
     while true do begin
         fromlen:=sizeof(from);
 
         if (listen(listen_socket,5) = SOCKET_ERROR) then exit;
 
         ClSock := accept(listen_socket, from, fromlen);
         if (ClSock = INVALID_SOCKET) then exit;
 
         with from.sin_addr.S_un_b do
           if not (((s_b1=#192) and (s_b2=#168) and
                    (s_b3=#242) and (s_b4 in [#31,#32])
                   ) or
                   ((s_b1=#127) and (s_b2=#0) and
                    (s_b3=#0)   and (s_b4=#1)
                   )
                  ) then begin
             append(t); if IOResult<>0 then rewrite(t);
             writeln(t, FormatDateTime('c', Now), ' ',
                        ord(s_b1), '.', ord(s_b2), '.', ord(s_b3), '.',
 ord(s_b4),
                        'Unauthorised access to tunnel on port ', LISTEN_PORT);
             close(t); inoutres:=0;
             CloseSocket(ClSock); WSAGetLastError;
             continue;
           end;
 
         SrSock := socket(AF_INET, SOCK_STREAM, 0);
         if (listen_socket = INVALID_SOCKET) then begin
             CloseSocket(ClSock); WSAGetLastError;
             continue;
         end;
         if (connect(SrSock, connect_addr, sizeof(connect_addr))=SOCKET_ERROR)
 then begin
             CloseSocket(ClSock); WSAGetLastError;
             CloseSocket(SrSock); WSAGetLastError;
             continue;
         end;
 
         CreateThread(nil, 16*1024, @ClientProc, nil, 0, Th);
         WaitForSingleObject(Event, -1);
         CreateThread(nil, 16*1024, @ServerProc, nil, 0, Th);
         WaitForSingleObject(Event, -1);
     end;
   finally
     WSACleanup;
     ExitProcess(-1);
   end;
 end.
 АДДДДДДДДДДДДДДДДДДДДДДД. ХВАТИТ tunnel.pas .ДДДДДДДДДДДДДДДДДДДДДДДЩ
 
 >>[Im new]`\./'Ъ [ Играл в сапёра. Много думал ] [ Suicide ] [ Asm ]
 
 ... TAGLN:(@c@)Г datacompboy@mail.ru ЕICQ:27235262Е [Team /Фepдoпepдoзники/]
 --- TEARL:<(#)>А Помни, Andrew, что жить бессмысленно. Ho и помиpать тоже!
  * Origin: L`L Путь к сердцу фидошника лежит через его нетмэйл (2:5000/111.33)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Http тунель   Serg Ratiashvily   07 Sep 2002 21:53:33 
 Re: Http тунель   Anton Fedorov   31 Oct 2002 19:30:42 
 Http тунель   Fedor Kudryashev   01 Nov 2002 05:14:46 
 Re: Http тунель   Anton Fedorov   01 Nov 2002 15:58:42 
 Http тунель   Fedor Kudryashev   02 Nov 2002 04:24:10 
 Re: Http тунель   Anton Fedorov   02 Nov 2002 16:43:18 
 Http тунель   Fedor Kudryashev   02 Nov 2002 19:09:51 
 Re: Http тунель   Anton Fedorov   03 Nov 2002 02:48:14 
 Http тунель   Dmitry Radishev   02 Nov 2002 13:57:04 
 RE:Http тунель   Kirill Neznamov   05 Nov 2002 15:47:14 
 Http тунель   Dmitry Radishev   06 Nov 2002 18:20:38 
 Http тунель   Andrew Nikolaev   03 Nov 2002 15:51:42 
 Re: Http тунель   Anton Fedorov   04 Nov 2002 19:53:58 
Архивное /ru.nethack/38313dc6c443.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional