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?
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!¡.
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
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
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:
Private Sub SockClient_DataArrival(ByVal bytesTotal As Long)
Dim Datos As String
Static Buffer As String
SockListen.GetData Datos
Buffer = Buffer & Datos
If Right$(Buffer, 1) = "|" Then
Buffer = Mid(Buffer, 1, Len(Buffer) - 1) ' Le quitamos el separador a los datos ya finalizados
Call Analizar(Buffer) 'Procedimiento que analiza los datos
Buffer = "" ' Vaciamos el Buffer
End If
End Sub
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
que tal si pruebas a enviar el archivo por partes?
salu2!
Cita de: 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
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.
Cita de: Drinky94 en 28 Febrero 2010, 13:41 PM
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.
Cita de: DarkMatrix en 28 Febrero 2010, 19:05 PM
Cita de: 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
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.
Cita de: Drinky94 en 28 Febrero 2010, 13:41 PM
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!
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!¡.
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.
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!¡.
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
: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