Autor Tema: proyecto proxy (empezando)  (Leído 3472 veces)

0 Usuarios y 1 Visitante están viendo este tema.

ratix2425

  • Bit
  • Mensajes: 9
  • Reputación: +0/-0
    • Ver Perfil
proyecto proxy (empezando)
« en: Enero 28, 2011, 01:14:40 pm »
ando diseñando un sencillo proxy, que de momento inicia bien
pero no se por que razon en un momento inexperado se cierra

otra veces me vota error 40006 y tampoco le doy con el truquito para repararlo

si alguien me pudiera hechar una mano con este sencillo programa,
o me facilitaran algun ocx de socket. me seria de mucha utilidad

gracias

adjunto proyecto
https://sites.google.com/site/kratix2425/vbproxy.rar?attredirects=0&d=1

_katze_

  • Bytes
  • *
  • Mensajes: 49
  • Reputación: +2/-0
    • Ver Perfil
Re:proyecto proxy (empezando)
« Respuesta #1 en: Enero 28, 2011, 03:34:58 pm »
usa el modulo .BAS de leandro para manejar socket lo veo sencillo para aquellos que recien empiesan...ya reviso el resto y veremos.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:proyecto proxy (empezando)
« Respuesta #2 en: Enero 28, 2011, 06:30:55 pm »
Hola, bienvenido al foro, primera sugerencia vos llamas a los controles proxy, envia y recibe lo cual es un poco confuso porque no se entiende que es cada palabra, es mejor que pongas un prefijo por ejemplo WsProxy, WsEnvia, WsRecibe.
tambien es bueno que identes el codigo y utilizes Option Explicit

despues el error es porque no trabajas con array de sokets, lo que pasa es lo siguiente, en el evento proxy_ConnectionRequest se situan varias peticiones en menos de un segundo esto es porque los navegadores trabajan con multihilos es decir estan manejando mas de una conexion simultanea a la vez suponete vos cargas esta pagina y por cada imagen que ves es una conexion independiente tambien tene en cuenta que esta pagina tiene un css y seguramente algun script que carga, entonces esas son todas penticiones que va haciendo el navegador en un mismo tiempo, y vos solo manejas una la del envia y recibe lo cual cuando se dispara el evento proxy_ConnectionRequest  llamas a

Código: [Seleccionar]
envia.Close
envia.Accept requestID

pero cuando en menos de un segundo llega otra petición el "envia" aun no termina de procesar la primera y el evento obliga a cerrar la primera conexion
entonces como solucionas esto, pues con array de controles de envia() , recibe() y getdatos() entonces cada vez que se dispare un enevnto evento proxy_ConnectionRequest asigna a un control de array envia() , recibe() y a la variable getdatos() la pecitcion entrante

entonces en la propiedad index de WsEnviar y el WsRecibe le pones "0" (en tiempo de diseño) y pegas este codigo

Código: [Seleccionar]
Option Explicit
Dim sGetDatos() As String

Private Sub Form_Load()
    Dim i As Long
    'leemos 255 controles  incluyendo el 0 serian 256 peticones de cada winsock
    For i = 1 To 255
        Load WsEnvia(i)
        Load WsRecibe(i)
    Next
    'redimencionamos la variable para almacenar las cabezeras
    ReDim sGetDatos(255)
   
    WsProxy.Close
    WsProxy.LocalPort = 8080
    WsProxy.Listen
   
End Sub

Private Sub WsProxy_ConnectionRequest(ByVal requestID As Long)
    Dim Index As Integer
    Dim i As Long

    'Buscamos un soket libre
    For i = 0 To 255
        If WsEnvia(i).State = sckClosed And WsRecibe(i).State = sckClosed Then
            Index = i
            Exit For
        End If
    Next

    Debug.Print Now, "Request", Index
   
    sGetDatos(Index) = vbNullString
    WsEnvia(Index).Close
    WsEnvia(Index).Accept requestID
End Sub

Private Sub WsEnvia_Close(Index As Integer)
    WsEnvia(Index).Close
    WsRecibe(Index).Close
End Sub

Private Sub WsEnvia_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim sDatos As String
    WsEnvia(Index).GetData sDatos

    sGetDatos(Index) = sGetDatos(Index) & sDatos
   
    'esperamos a que se termine de completar la cabezera
    If InStr(sGetDatos(Index), vbCrLf & vbCrLf) Then
        Call EnviarRespuesta(Index, sGetDatos(Index))
    End If

End Sub

Private Function EnviarRespuesta(Index As Integer, sDatos As String)
    Dim omg As urlinfo
    omg = getinfor(sDatos)
    WsRecibe(Index).Close
    WsRecibe(Index).Connect omg.url, omg.port
    Debug.Print Now, "Connect", omg.url, omg.port
End Function


Private Sub WsEnvia_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    WsRecibe(Index).Close
    WsEnvia(Index).Close
    Debug.Print Now, "Error", Number, Description
End Sub

Private Sub WsRecibe_Connect(Index As Integer)
    WsRecibe(Index).SendData sGetDatos(Index)
    sGetDatos(Index) = vbNullString
End Sub

Private Sub WsRecibe_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim sDatos As String
    WsRecibe(Index).GetData sDatos
    WsEnvia(Index).SendData sDatos
End Sub

funciona bastante bien con paginas comunes pero las que tienen contenidos de video falla, no me puse a ver mucho en detalle pero bueno funciona mejor. (tampoco lo probe fuera de la pc es decir con 127.0.0.1)

ratix2425

  • Bit
  • Mensajes: 9
  • Reputación: +0/-0
    • Ver Perfil
Re:proyecto proxy (empezando)
« Respuesta #3 en: Enero 28, 2011, 07:06:56 pm »
wow gracias leandro,
no tenia ni idea que tocaba crear array de controles y el programa funciona de maravilla

pero
Citar
funciona bastante bien con paginas comunes pero las que tienen contenidos de video falla, no me puse a ver mucho en detalle pero bueno funciona mejor
que mas le faltaria a la aplicacion para que se ejecute perfectamente en cualquier web y no presente errores.

y otra cosa que me acabo de dar cuenta es que con el iexplorer no funciona porque la funcion para obtener la url es diferente a como la venia probando con chrome.pero eso es reparable

gracias