Error de transmision por socket

Iniciado por Nanoc, 28 Febrero 2010, 01:01 AM

0 Miembros y 2 Visitantes están viendo este tema.

Nanoc

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?

BlackZeroX

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!¡.
The Dark Shadow is my passion.

Nanoc

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

DarkMatrix

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 (vb) [Seleccionar]

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

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

Nanoc

#4
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

fary

que tal si pruebas a enviar el archivo por partes?

salu2!
Un byte a la izquierda.

DarkMatrix

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.

Todo aquello que no se puede hacer, es lo que no intentamos hacer.
Projecto Ani-Dimension Digital Duel Masters (Juego de cartas masivo multijugador online hecho en Visual Basic 6.0)

Desing by DarkMatrix

fary

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!
Un byte a la izquierda.

BlackZeroX

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!¡.
The Dark Shadow is my passion.

Nanoc

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.