Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: APOKLIPTICO en 29 Septiembre 2007, 05:00 am



Título: Problema con Sockets
Publicado por: APOKLIPTICO en 29 Septiembre 2007, 05:00 am
Hola!, estoy haciendo un programa que redirecciona el tráfico que le llega de un puerto hacia otro, tiene como fin hacer accesibles todas las máquinas de una lan usando como "router" a una que previamente se le han abierto los puertos en el router real. Use getdata pero me daba muchos errores, habian muchos paquetes perdidos y los datos en si son imposibles de interpretar. Cambie getdata por peekdata y mejoró muchisimo, pero solo a nivel localhost. Osea:

Caso winsock.GetData:

localhost---->Redireccionador(Localhost)----->192.168.1.1

Se perdían muchos paquetes.

Caso winsock.PeekData:

localhost---->Redireccionador(Localhost)----->192.168.1.1

Casi perfecto, el 80% de las veces no se perdían paquetes.

Aca viene el problema:

Usando winsock.PeekData:

localhost---->Redireccionador(Otra PC LAN)----->192.168.1.1

La cantidad de paquetes perdidos era increible.

Usando winsock.PeekData:

localhost---->Redireccionador(Otra PC LAN)---->www.yahoo.com.ar

Se perdían tantos paquetes que no recibía bien la request y tampoco se recibía la respuesta de yahoo.com.ar (Bad Request).

Ahora, mis pregunta es la siguiente: Hay alguna manera de esperar a que los datos se hayan enviado/recibido, antes de tratar de enviar/recibir otra tanda de datos nueva?.


Saludos!!


Título: Re: Problema con Sockets
Publicado por: APOKLIPTICO en 30 Septiembre 2007, 18:47 pm
Alguien que me pueda dar una respuesta??  :( :(


Título: Re: Problema con Sockets
Publicado por: LeandroA en 30 Septiembre 2007, 23:39 pm
hola no se bien como estas haciendo las cosas, pero creo que lo que vos buscas es el evento winsock1_SendComplete , yo lo que ago a menudo es poner una variable tipo boolean en el general y cuando se da este evento la paso a true entonces sigo enviando los paquetes, para el caso de recivir los datos si trabajas con html se supone que recives los paquetes completos justo cuando se cierra la conexion.

es algo asi lo que preguntas?

bueno , nose, te comento si estas trabajando con array de conexiones, yo tuve y tengo mala experiencia con este tema, no se si sea un problema de el winsock.ocx o visual b o mio. pero si intento enviar datos al mismo tiempo con mas de una conexion no jala como deberia.

Saludos


 


Título: Re: Problema con Sockets
Publicado por: APOKLIPTICO en 1 Octubre 2007, 00:17 am
El send anda bien, el problema es el receive. Alguna otra sugerencia???


Título: Re: Problema con Sockets
Publicado por: MazarD en 2 Octubre 2007, 19:19 pm
Debes tener en cuenta que puedes hacer un send del tamaño que te dé la gana pero en la otra parte los datos completos enviados lo vas a recibir en varios eventos data_arryval (o como se escriba) distintos.
Imagino que lo que haces es un
tal.getdata buff
tal2.senddata buff
Entonces en getdata solo has recibido una parte y por lo tanto solo envias una parte del paquete.

No recuerdo muy bien los eventos de winsock en vb pero sin usar ninguno de ellos lo que puedes hacer es en cada send enviar el tamaño total de los datos que se pretenden enviar y en el getdata ir acumulando todo en un buffer hasta llegar a este tamaño antes de hacer el send a la parte final.

Espero haberte entendido y aclarado algo.

Saludos.


Título: Re: Problema con Sockets
Publicado por: APOKLIPTICO en 4 Octubre 2007, 05:05 am
Es buena esa, cuando tenga tiempo lo pruebo. Mil Gracias

PD: Probado  :P no anda, el tema es que eso no lo puedo hacer, ya que el paquete no lo manda un programa hecho por mi, sino un servidor http en este caso.


Título: Re: Problema con Sockets
Publicado por: Ferсhu en 4 Octubre 2007, 06:45 am
winsock1_SendComplete, Es solo un evento q se activa cuando todo se envio, en control winsock no sabe si se perdieron o no paketes, solo activa el evento cuando termino de enviar todo.

Para mi el control de winsock no es muy confiable con paketes Tcp, me parece ami. Udp en una red va bien.

Citar
localhost---->Redireccionador(Localhost)----->192.168.1.1

usas 2 winsock o el mismo??

tmb creo q podes hacer tambytes=winsock.getdata buffer, y cuando no llega el tamaño maximo te das cuenta por tambytes, entonces armas el buffer y lo envias entero, pero nose como haces si mandas a medida q llegan o esperas a recibir todo y envias un pakete entero.


Título: Re: Problema con Sockets
Publicado por: APOKLIPTICO en 4 Octubre 2007, 20:02 pm
Código
  1. Private Sub Ws_DataArrival(ByVal bytesTotal As Long)
  2. 'On Error Resume Next
  3. Dim data
  4. Ws.GetData data
  5. data = StrConv(data, vbUnicode)
  6. Do Until ws1.State = 7 Or ws1.State = 9
  7. DoEvents
  8. Loop
  9. ws1.SendData data
  10. End Sub
  11.  
  12. Private Sub ws1_DataArrival(ByVal bytesTotal As Long)
  13. 'On Error Resume Next
  14. Dim data
  15. ws1.PeekData data
  16. data = StrConv(data, vbUnicode)
  17. Ws.SendData data
  18. End Sub

De esto se trata


Título: Re: Problema con Sockets
Publicado por: Ferсhu en 4 Octubre 2007, 20:53 pm
Citar
data = StrConv(data, vbUnicode)

No entiendo para q esto si vb ya trabaja con unicode.

Citar
Do Until ws1.State = 7 Or ws1.State = 9
DoEvents
Loop
ws1.SendData data

Podrias probar de poner ws1.SendData, en el evento Ws_SendComplete, ademas es mas simple.

data podrias explicitar q es string, sino creo q lo toma como variant, si no recuerdo mal  :-\


Título: Re: Problema con Sockets
Publicado por: APOKLIPTICO en 6 Octubre 2007, 23:12 pm
Si, es verdad todo lo que decis pero el problema no esta ahi...
Alguna otra sugerencia?
Salu2