Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Nanoc en 28 Febrero 2010, 01:01 am



Título: Error de transmision por socket
Publicado por: Nanoc en 28 Febrero 2010, 01:01 am
Buenas, estoi usando el control winsock para una aplicacion, funciona todo perfectamente, tengo otra aplicacion en C que es la que conecta, ocurre, que al enviar un paquete grande desde la aplicacion en C, no llega todo a la que esta en VB, solo llega un pedazo.

En las pruebas que hice, vi que mi aplicacion en C enviaba correctamente todo concretamente 2057 bytes
Pero en el VB, solo recibia 1460 bytes, y efectivamente no es correcto el resultado mostrado.

Alguna idea?


Título: Re: Error de transmision por socket
Publicado por: BlackZeroX en 28 Febrero 2010, 02:28 am
Código del DataArrival?... pero bueno,  esto mismo tenia yo, y era el buffer de almacenamiento en el DataArrival, así al aire no se puede deducir mucho.

Sangrientas Lunas!¡.


Título: Re: Error de transmision por socket
Publicado por: Nanoc en 28 Febrero 2010, 02:56 am
El buffer es un tipo String, no he puesto antes el codigo del data arrival por que dudo mucho que sirva de algo, como ya he dicho, funciona perfectamente excepto con los paquetes grandes, de todos modos colocare esta parte
Código:
Dim Data As String
Dim sBuffer() As String

sBuffer = Split(Data, ",")
Select Case (sBuffer(0))
Case ("ld")
Select Case sBuffer(1)
Case "0"
Form3.List1.Clear
Call Form3.mostrararchivos(sBuffer, True)
Ws.SendData ("ld, ,1")
Case "1"
Form3.List2.Clear
Call Form3.mostrararchivos(sBuffer, False)
MsgBox "Bytes received: " & bytesTotal
Case "failed"
MsgBox "Error al listar archivos"
End Select

Podria ser por algun parametro interno de winsock que me limita los bytes a recibir? puedo modificarlo? o es mejor que divida los datos en dos paquetes?

En cualquier caso necesitaria saber cual es el maximo que puedo recibir por paquete.

PD: En el servidor estoy enviando con winsock y no me da problemas, por que el winsock de VB6 no puede recibir y el de C++ si puede enviar? (Esto en caso de que el error valla por hay)

Espero ayuda
Gracias


Título: Re: Error de transmision por socket
Publicado por: DarkMatrix en 28 Febrero 2010, 07:27 am
Buenas, tal cual como dice nuestro amigo BlackZeroX▓▓▒▒░░ tu problema es con el buffer, antes de analizar los datos debes asegurarte de que todos los datos hallan llegado correctamente. Para esto yo te recomendaria poner algo como un caracter que finalize los datos, y mientras este caracter no llegue no analize los datos; ya que si los datos vienen incompletos por supuesto que te va a dar error tu aplicacion :P.

Un pequeño Ejemplillo:

Código
  1. Private Sub SockClient_DataArrival(ByVal bytesTotal As Long)  
  2.    Dim Datos As String
  3.    Static Buffer As String
  4.  
  5.    SockListen.GetData Datos  
  6.  
  7.    Buffer = Buffer & Datos  
  8.  
  9.    If Right$(Buffer, 1) = "|" Then
  10.        Buffer = Mid(Buffer, 1, Len(Buffer) - 1) ' Le quitamos el separador a los datos ya finalizados  
  11.        Call Analizar(Buffer) 'Procedimiento que analiza los datos
  12.        Buffer = "" ' Vaciamos el Buffer
  13.    End If
  14.  
  15. End Sub


Título: Re: Error de transmision por socket
Publicado por: Nanoc en 28 Febrero 2010, 12:12 pm
Y en el caso de que no reciba ese caracter al final de los datos que sugieres que haga mi aplicacion?

Sigo pensando que si puedo aumentar el tamaño maximo que puedo recibir seria mas efectivo


Título: Re: Error de transmision por socket
Publicado por: fary en 28 Febrero 2010, 13:41 pm
que tal si pruebas a enviar el archivo por partes?

salu2!


Título: Re: Error de transmision por socket
Publicado por: DarkMatrix en 28 Febrero 2010, 19:05 pm
Y en el caso de que no reciba ese caracter al final de los datos que sugieres que haga mi aplicacion?

Sigo pensando que si puedo aumentar el tamaño maximo que puedo recibir seria mas efectivo

Si se recibe el caracter final. El tamaño maximo que recibe el sock a la vez es de 8192 bytes si no me equivoco, de igual forma hay veces que aunque tu envies esa cantidad de datos lo recibira por partes inferiores a 8192, he comprobado que esto solo sucede cuando estas conectado por internet pero si es local si se rciben los 8192 bytes.

que tal si pruebas a enviar el archivo por partes?

salu2!

Vendria siendo lo mismo porque el cliente tendria que esperar hasta que arrive todo el archivo para poder analizarlo.


Título: Re: Error de transmision por socket
Publicado por: fary en 28 Febrero 2010, 19:15 pm
Y en el caso de que no reciba ese caracter al final de los datos que sugieres que haga mi aplicacion?

Sigo pensando que si puedo aumentar el tamaño maximo que puedo recibir seria mas efectivo

Si se recibe el caracter final. El tamaño maximo que recibe el sock a la vez es de 8192 bytes si no me equivoco, de igual forma hay veces que aunque tu envies esa cantidad de datos lo recibira por partes inferiores a 8192, he comprobado que esto solo sucede cuando estas conectado por internet pero si es local si se rciben los 8192 bytes.

que tal si pruebas a enviar el archivo por partes?

salu2!

Vendria siendo lo mismo porque el cliente tendria que esperar hasta que arrive todo el archivo para poder analizarlo.


cierto... esque realmente si recibe parte de los datos creo qu eno tendria error logico... :/  porque si estubiera mal no recibiria nada....


salu2!


Título: Re: Error de transmision por socket
Publicado por: BlackZeroX en 28 Febrero 2010, 20:25 pm
a facil un "temporalizador" en ese socket y ya, si no llega el ese caracter en X tiemo desues del ultimo paquete recibido se cancela todo. con un hook al form podría ser, ara evitar usar el procesador con un timer

Sangrientas Lunas!¡.


Título: Re: Error de transmision por socket
Publicado por: Nanoc en 28 Febrero 2010, 23:40 pm
Si hago eso ultimo no voy a recibir bien nunca, el socket funciona perfecto, es solo que en la funcion que lista los directorios, cuando pido un directorio muy grande (como system32) pues no me lista todos los directorios ni tampoco todos los archivos.


Título: Re: Error de transmision por socket
Publicado por: BlackZeroX en 1 Marzo 2010, 00:28 am
yo lo decia similar a esto, solo que con un hook para verificar en cada mensaje a el form verificar el tiempo que a transcurrido en los paquetes que aun se siguen recibiendo o enviando.

http://foro.elhacker.net/programacion_vb/listview_item_and_elapse_time-t284947.0.html

o lo aplico en mi Explorador Remoto para validar conexiones  procesos de lo contrario cancelo y reinicio ese socket, hasta ahora no me causa un retardo en otras conexiones o similares.

Sangrientas Lunas!¡.


Título: Re: Error de transmision por socket
Publicado por: Nanoc en 1 Marzo 2010, 12:11 pm
Podria ser algun problema de mi protocolo el que hace que solo reciba una parte del socket? de todos modos el valor de bytestotal en el data arrival es incorrecto y repito, no es que el error ocurra algunas veces, pasa siempre, no es una solucion detectarlo y reintentar

Espero alguna ayuda


Título: Re: Error de transmision por socket
Publicado por: pepepoing en 22 Agosto 2013, 19:01 pm
 :P, espero no llegar muy tarde para una solución.  :rolleyes:

utilizando el código de DarkMatrix, y modificandolo un poko puedes tomar la trama completa por partes, la idea es la misma colocar un carácter al final de la transmicion del mensaje, pero si va mas de un mensaje... o llegan mas de uno puede ser que llegue mas de un carácter de finalizacion y no tome bien la cosa, así que para asegurar de tomar solo el mensaje puedes usar el siguiente codigo: :silbar:

Private Sub SockListen_DataArrival(ByVal bytesTotal As Long)
    Dim Datos As String
    Static Buffer As String
    SockListen.GetData Datos
    Buffer = Buffer & Datos
    Call Comprobar(Buffer)
End Sub

Sub Comprobar(Buffer As String)
    Dim Caracter As Integer
    Caracter = InStr(1, Buffer, "|")
    If Caracter <> 0 Then
        Dim Comando As String
        Comando = Left(Buffer, Caracter - 1)
        Call Analizar(Comando)
        Buffer = Mid(Buffer, Caracter + 1, Len(Buffer))
        Call Comprobar(Buffer)
    End If
End Sub


Sub Analizar(Buffer As String)
    'lo que quieras hacer con la trama
End Sub