Problema con Sockets

Iniciado por APOKLIPTICO, 29 Septiembre 2007, 05:00 AM

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

APOKLIPTICO

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!!
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

APOKLIPTICO

Alguien que me pueda dar una respuesta??  :( :(
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

LeandroA

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



APOKLIPTICO

El send anda bien, el problema es el receive. Alguna otra sugerencia???
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

MazarD

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.
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

APOKLIPTICO

#5
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.
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Ferсhu

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.

Citarlocalhost---->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.

APOKLIPTICO

Código (vb) [Seleccionar]
Private Sub Ws_DataArrival(ByVal bytesTotal As Long)
'On Error Resume Next
Dim data
Ws.GetData data
data = StrConv(data, vbUnicode)
Do Until ws1.State = 7 Or ws1.State = 9
DoEvents
Loop
ws1.SendData data
End Sub

Private Sub ws1_DataArrival(ByVal bytesTotal As Long)
'On Error Resume Next
Dim data
ws1.PeekData data
data = StrConv(data, vbUnicode)
Ws.SendData data
End Sub


De esto se trata
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Ferсhu

Citardata = StrConv(data, vbUnicode)

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

CitarDo 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  :-\

APOKLIPTICO

Si, es verdad todo lo que decis pero el problema no esta ahi...
Alguna otra sugerencia?
Salu2
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.