Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2006
ULVIER ULVIER is offline
Registrado
 
Registrado: ene 2006
Ubicación: En el sur de la ciudad
Posts: 5
Poder: 0
ULVIER Va por buen camino
Crear un proxy

Hola a todos los que se encuentren conectados, bueno mi problema es que en la universidad en la materia de comunicaciones me piden que cree un proxy.
Que le permita a una máquina conectarse a internet a través de otra máquina(esta va a tener la aplicación proxy). Realmente he buscado en el internet pero no he encontrado nada lo único que encuentro es la comunicación entre computadoras a través de sockets pero nada de un proxy, a ver si alguien me puede hechar una mano por favor de antemano mil gracias...
Responder Con Cita
  #2  
Antiguo 04-05-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si quieres una solucion rapida puedes usar el componente TIdHTTPProxyServer de Indy. Solo es colocarlo y activarlo y ya tienes un proxy funcionando.

Pero si lo que quieres es hacer uno tu desde cero, entonces la cosa se complica mas. En principio un proxy funcina de una forma muy similar a un servidor web, esta escuhando por un puerto y recibe los comandos (Get, Post, Head, Connect) y devuelve un archivo. La diferencia entre el servidor y el proxy es que el proxy descarga los archivos de internet antes de mandarselos al cliente. Espero haberme explicado.

Entonces podemos partir de un servidor web ya montado (el IdHttpServer o cualquier otro) y añadirle las funciones necesarias para convertirlo en un Proxy. Pero si lo que quieres es hacerlo desde cero, sera mejor que te busques informacion sobre como manejar sockets y aqui te dejo una lectura interesante el protocolo http para que le eches un vistazo.

Última edición por seoane fecha: 04-05-2006 a las 13:57:37.
Responder Con Cita
  #3  
Antiguo 04-05-2006
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
¿De donde eres. de que universidad eres ULVIER que
te han pedido hacer un proxi?

yo creo que al menos te habran dicho, o dado ,esquemas en las
clases, que llevas.
Responder Con Cita
  #4  
Antiguo 10-05-2006
ULVIER ULVIER is offline
Registrado
 
Registrado: ene 2006
Ubicación: En el sur de la ciudad
Posts: 5
Poder: 0
ULVIER Va por buen camino
Red face después de leer

Hola de nuevo, después de haber revisado el link que me recomendó pues se me ha quedado claro de que debo utilizar el protocolo html y activar su puerto (80), y trabajar con los sockets que son los que me dan las conexiones entre computadoras, los mismos que también utilizan puertos, el problema es que lo único que encuentro es teoría y no lo puedo implementar, les agradecería muchísimo si me facilitaran un poco de código mil gracias de nuevo....http://www.clubdelphi.com/foros/images/icons/icon11.gif
Responder Con Cita
  #5  
Antiguo 20-05-2006
gemu gemu is offline
Registrado
 
Registrado: may 2006
Posts: 3
Poder: 0
gemu Va por buen camino
Bueno un proxy no tiene porque ser necesariamente http, tambien existen los proxys socks que son de multiproposito y su implementacion basica es muy sencilla www.socks.permeo.com en esa web tienes algo de informacion al respecto, aunq si tu proxy debe ser basico y conectar a un solo sitio, entonces puedes usar TIdMappedPortTCP que cumple esa funcion.

saludos.
Responder Con Cita
  #6  
Antiguo 20-05-2006
ULVIER ULVIER is offline
Registrado
 
Registrado: ene 2006
Ubicación: En el sur de la ciudad
Posts: 5
Poder: 0
ULVIER Va por buen camino
Lo más básico posible

Lo único que me pide es que un browser de cualquier otra computadora, que configure como su proxy la máquina servidor(la que tiene el proxy) escriba el URL y haga la petición de la página, por otro lado el servidor debe coger el URL y pedir el código de la página y entregarle al cliente nada más, que no controle nada, he investigado sobre sockets, socketserver y cliente, y me recomendaron que al proyecto lo divida en 2 partes, la primera que viene a ser la comunicación entre el cliente y el servidor y la otra parte que es la comunicación entre el servidor de internet y el servidor proxy.
Seguiré buscando y si me pueden facilitar algo de código muchas gracias, es la primera vez que me pongo a hacer un proyecto que implique comunicaciones gracias nuevamente..
Responder Con Cita
  #7  
Antiguo 22-05-2006
gemu gemu is offline
Registrado
 
Registrado: may 2006
Posts: 3
Poder: 0
gemu Va por buen camino
Codigo Proxy Socks4A

Hola, pues es muy facil hacer un proxy socks, yo ayer termine 1 xD, basandome en las especificaciones:
http://www.socks.permeo.com/AboutSOCKS/SOCKSvE.asp
tambien puedes hacer la version 5 q es la mas reciente, de todas formas te pasteo el codigo. Esto esta creado en C++ Builder usando Indy 9, pero es muy facil traducirlo a delphi.

Necesitas un formulario con
TEdit llamado Edit1 y Text = 1080
TButton llamado Button1 y Caption = "Start"
TLabel llamado Label2 y Caption = 0 (este sera solo un contador de conexiones, muy simple)
TIdTCPServer llamado IdTCPServer1 con sus valores por defecto.

El codigo es el siguiente:

Unit1.cpp
Código PHP:
//
// EJEMPLO PROXY SOCKS 4A
// Creado por Gemu - www.netsock.net
//
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (
Button1->Caption == "Start")
    {
        
Button1->Caption "Stop";
        
IdTCPServer1->DefaultPort Edit1->Text.ToInt();
        
IdTCPServer1->Active true;
    }
    else
    {
        
IdTCPServer1->Active false;
        
Button1->Caption "Start";
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
    
TIdTCPClient            *dstSock;
    
TSocksRequestPacket     srp;

    try
    {
        
// define el timeout
        
AThread->Connection->ReadTimeout 10000;

        
// obtiene el paquete de solicitud Proxs
        
srp SocksRequestPacket(AThread->Connection);
        
// comprueba los datos Socks4
        
if (srp.VN != 4) throw ESocksRequestError(); // solo Socks4
        
if (srp.CD != 1) throw ESocksRequestError(); // solo CONNECT (no BIND)
        
        // intenta conectar el cliente
        
dstSock = new TIdTCPClient(NULL);
        
dstSock->Host srp.DSTIP;
        
dstSock->Port srp.DSTPORT;
        
dstSock->Connect(5000); // 5seg

        // establecida la conexion, retorna respuesta
        
SocksResponsePacket(AThread->ConnectionREQUEST_GRANTEDsrp.DSTPORTsrp.DSTIP);

        


        
// inicia el flujo de datos
        
char                flowBuffer[8192];
        
int                 flowCount;
        
AThread->Connection->ReadTimeout IdTimeoutInfinite;

        while (
true)
        {
            
// lee del servidor
            
if(dstSock->Socket->Readable(20))
            {
                
flowCount dstSock->Socket->Recv(flowBuffersizeof(flowBuffer));
                if (
flowCount 1) throw EIdConnClosedGracefully(NULL);
                
AThread->Connection->Socket->Send(flowBufferflowCount);
            }

            
// lee del cliente
            
if(AThread->Connection->Socket->Readable(20))
            {
                
flowCount AThread->Connection->Socket->Recv(flowBuffersizeof(flowBuffer));
                if (
flowCount 1) throw EIdConnClosedGracefully(NULL);
                
dstSock->Socket->Send(flowBufferflowCount);
            }
        }
        
    }
    catch(
ESocksRequestError)
    {
        
SocksResponsePacket(AThread->ConnectionREQUEST_REJECTED_OR_FAILED);    
    }
    catch(...)
    {
        
// no hace nada
    
}

    
// desconecta
    
try
    {
        
dstSock->Disconnect();
        
delete dstSock;
    }
    catch(...)
    {
        
// no hace nada
    
}

    
AThread->Connection->Disconnect();
}
//---------------------------------------------------------------------------
TSocksRequestPacket __fastcall TForm1::SocksRequestPacket(TIdTCPServerConnection *Connection)
{
    
TSocksRequestPacket     srp;
    
byte                    prt[2];
    
char                    c;


    
/* Implementacion Socks4 */
    
    // VN | CD
    
Connection->ReadBuffer(&srp2);

    
// DSTPORT
    
Connection->ReadBuffer(&prt2);
    
srp.DSTPORT = (((unsigned int)prt[0]<<8) | prt[1]);

    
// DSTIP
    
for(int i=0i<4i++)
    {
        
Connection->ReadBuffer(&c1);
        
srp.DSTIP += (byte)c;
        if(
i<3srp.DSTIP += '.';
    }

    
// USERID
    // lee un maximo de 256 caracteres, evita el bucle infinito
    
for(int i=0i<256i++)
    {
        
Connection->ReadBuffer(&c1);
        if(
== 0) break;

        
srp.USERID += c;
    }


    
/* implementacion Socks4A */
    
    
if(srp.DSTIP.SubString(0,6) == "0.0.0.")
    {
        
srp.DSTIP ""// limpia la IP destino
        
        // DSTIP (como DNS)
        // lee un maximo de 256 caracteres, evita el bucle infinito
        
for(int i=0i<256i++)
        {
            
Connection->ReadBuffer(&c1);
            if(
== 0) break;

            
srp.DSTIP += c;
        }

        
// obtiene la IP del HOST
        
srp.DSTIP GStack->ResolveHost(srp.DSTIP);    
    }


    return 
srp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SocksResponsePacket(TIdTCPServerConnection *ConnectionTSocksReplyCode codeAnsiString dstportAnsiString dstip)
{
    
TSocksRequestPacket     srp;
    
byte                    b_dstport[2];
    
byte                    b_dstip[4];

    
// VN | CD
    
srp.VN 0;
    
srp.CD = (char)code;
    
Connection->WriteBuffer(&srp2);


    
    
// DSTPORT
    
b_dstport[0] = dstport >> 8;
    
b_dstport[1] = dstport 0xFF;
    
Connection->WriteBuffer(b_dstport2);

    
// DSTIP
    
TStringList *sl = new TStringList();
    
sl->Delimiter '.'sl->DelimitedText dstip
    for(
int i=0i<sl->Counti++)
            
b_dstip[i] = sl->Strings[i].ToIntDef(0);
    
delete sl;
    
Connection->WriteBuffer(b_dstip4);
}


void __fastcall TForm1::IdTCPServer1Connect(TIdPeerThread *AThread)
{
    
Label2->Caption Label2->Caption.ToInt() + 1;    
}
//---------------------------------------------------------------------------

void __fastcall TForm1::IdTCPServer1Disconnect(TIdPeerThread *AThread)
{
    
Label2->Caption Label2->Caption.ToInt() - 1;    
}
//--------------------------------------------------------------------------- 
Unit1.h
Código PHP:
//
// EJEMPLO PROXY SOCKS 4A
// Creado por Gemu - www.netsock.net
//
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdTCPServer.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include <IdDNSResolver.hpp>
#include <IdUDPBase.hpp>
#include <IdUDPClient.hpp>
//---------------------------------------------------------------------------
typedef struct
{
    
char            VN;
    
char            CD;
    
unsigned int    DSTPORT;
    
AnsiString      DSTIP;
    
AnsiString      USERID;
TSocksRequestPacket;

enum TSocksReplyCode {
    
REQUEST_GRANTED                 90,
    
REQUEST_REJECTED_OR_FAILED      91,
    
REQUEST_IDENTD_REJECTED         92,
    
REQUEST_IDENTD_INVALID_USERID   93
};

class 
ESocksRequestError
{
};

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    
TIdTCPServer *IdTCPServer1;
    
TEdit *Edit1;
    
TButton *Button1;
    
TIdTCPClient *no_se_usa;
    
TLabel *Label1;
    
TLabel *Label2;
    
void __fastcall Button1Click(TObject *Sender);
    
void __fastcall IdTCPServer1Execute(TIdPeerThread *AThread);
    
void __fastcall IdTCPServer1Connect(TIdPeerThread *AThread);
    
void __fastcall IdTCPServer1Disconnect(TIdPeerThread *AThread);
private:    
// User declarations
public:        // User declarations
    
__fastcall TForm1(TComponentOwner);

    
/* Socks */
    
TSocksRequestPacket __fastcall SocksRequestPacket(TIdTCPServerConnection *Connection);
    
void __fastcall SocksResponsePacket(TIdTCPServerConnection *ConnectionTSocksReplyCode codeAnsiString dstport=0AnsiString dstip=0);
    
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif 
Lo unico que necesito es implemetar el soporte para SSL :S, alguien sabra como se hace eso? pense q deberia funcionar por ser TCP pero no lo hace.

PD: Firefox creo que no implementa bien las especificaciones Socks4 porque pierde los datos de respuesta del protocolo e intenta interpretarlo como HTML, y como resultado te muestra el dialogo de descargar archivo :P.

espero q les sirva, saludos (y)
GEMU
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con proxy squit rastafarey Linux 1 19-07-2007 21:09:40
WebBrowser + Proxy zurech Internet 2 03-12-2005 14:50:23
Proxy en WebConnection Balda Providers 0 15-06-2005 19:09:56
proxy java adrianbcn90 JAVA 0 14-12-2004 17:30:11
Conectar a través de un PROXY Charcab Internet 3 14-09-2003 23:58:45


La franja horaria es GMT +2. Ahora son las 19:49:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi