Problema con codigo!!!

Iniciado por Nemutagk, 15 Enero 2010, 23:08 PM

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

Nemutagk

Que tal, soy viejo lector del sitio / foro, pero apenas ahora escribo, no vengo a solicitar codigo ni que me hagan nada ;D, solo simplemente solicito de la manera mas atenta si pueden ayudarme a ver que estoy haciendo mal, veran, tengo una aplicacion cliente/servidor, que "monitorea" una maquina desatendida, que esta hace calculos matematicos y demas, la aplicacion cliente que se instala en dicha maquina lo unico que tiene que hacer es mandar screenshots de la maquina en cuestion al servidor, donde regularmente son checados, ya tengo ambas aplicaciones (cliente y servidor) y ya "envian" datos, sin embargo, no logro "guardar" eso datos en el archivo, ejemplo, el cliente me envia una imagen bmp (screenshot.bmp) de 3.2mb, el servidor acepta el envio y segun el contador de bytes recibidos se reciben todos los bytes (los 3.2mb), pero cuando verifico el archivo generado (en la maquina donde esta el servidor) solo se guardan 54bytes, que verificando en el programa servidor es el ultimo paquete que se envia del cliente al servidor, aqui dejo el codigo de los programas

cliente...
Código (vb) [Seleccionar]

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Buffer As String
    Winsock1.GetData Buffer
    estado.Text = estado.Text + vbCrLf + "Comando: " + Buffer
    estado.SelStart = Len(estado.Text)
    comandos (Buffer)
End Sub

Public Function comandos(comando As String)
    If comando = "screenshot" Then
        Picture1.Picture = CaptureScreen()
        SavePicture Picture1.Picture, "c:\screenshot.bmp"
        urlFile.Text = "c:\screenshot.bmp"
       
        Open urlFile For Binary As #1
            var_DataFile = Input(LOF(1), 1)
        Close #1
       
        var_DataSize = Len(var_DataFile)
        estado.Text = estado.Text & vbCrLf & "Enviando informacion de datos..."
        estado.SelStart = Len(estado.Text)
        Winsock1.SendData "Envio|" & urlFile.Text & "|" & var_DataSize
    End If
   
    If comando = "enviar" Then
        Call sendfile
    End If
End Function

Public Function sendfile()
    estado.Text = estado.Text & vbCrLf & "Enviando datos..."
    estado.SelStart = Len(estado.Text)
    Winsock1.SendData var_DataFile
End Function


Servidor...
Código (vb) [Seleccionar]

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Texto As String
    Dim Ruta As String
    Dim Peso As String
    Dim suma As String
    Dim Temporal As String
   
    Winsock1.GetData Texto
   
    If Mid(Texto, 1, 5) = "Envio" Then
        estado.Text = estado.Text & vbCrLf & "Solicitando informacion del archivo..."
        estado.Text = estado.Text & vbCrLf & Texto
        estado.SelStart = Len(estado.Text)
        Texto = Mid(Texto, 7, Len(Texto) - 5)
        For i = 1 To Len(Texto)
            If Mid(Texto, 1, 1) <> "|" Then
                Ruta = Ruta + Mid(Texto, 1, 1)
            ElseIf Mid(Texto, 1, 1) = "|" Then
                Texto = Mid(Texto, 2, Len(Texto) - 1)
                Exit For
            End If
            Texto = Mid(Texto, 2, Len(Texto) - 1)
        Next
        Peso = Val(Texto)
        estado.Text = estado.Text & vbCrLf & "Ruta del archivo: " & Ruta
        estado.SelStart = Len(estado.Text)
        nomFile.Text = Ruta
        estado.Text = estado.Text & vbCrLf & "Peso del archivo: " & Peso
        estado.SelStart = Len(estado.Text)
        pesoFile.Text = Peso
        estado.Text = estado.Text & vbCrLf & "Solicitando archivo..."
        estado.SelStart = Len(estado.Text)
        Winsock1.SendData "enviar"
    Else
        If Len(Temporal) <> pesoFile.Text Then
            Temporal = Temporal + Texto
            bytes.Text = Len(Texto)
            numSuma.Text = Val(numSuma.Text) + Val(bytes.Text)
        End If
       
        If numSuma.Text = pesoFile.Text Then
            Open nomFile For Binary As #1
            Put #1, 1, Temporal
            Close #1
            Ruta = ""
            estado.Text = estado.Text & vbCrLf & "El archivo se recibio correctamente..."
            estado.SelStart = Len(estado.Text)
        End If
    End If
End Sub


segun yo, el problema esta en la parte de...

Código (vb) [Seleccionar]
Temporal = Temporal + Texto

...pero no estoy ya del todo seguro, si alguien me puede ayudar se los agradeceria muchismp :silbar:

cobein

Mira sin correr el codigo es dificil saber cual es el problema (si no es algo obvio) pero puede que esto "Temporal = Temporal + Texto" te este dando dolores de cabeza cambia el + por un &.
De igual manera sera mejor que pongas los datos recibidos en el archivo de una, no hay necesidad de usar un buffer.

algo asi:

            Open nomFile For Binary As #1
            Put #1, lof(1)+1, Texto
            Close #1
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

Nemutagk

#2
Gracias, ya intente cambiando el + por el &, pero no funciono, ahora intentare lo que comentas, muchas gracias por tu ayuda  ;-)

------

Bueno, eh modificado el codigo como me comentaste, sin la utilizacion de "buffer"y funciono a la perfeccion, solo me quedo una duda, esto en alguna ocacion podria generar archivos corruptos (por paquetes perdidos o algo asi =P), de nuevo muchas gracias!!!!

cobein

Si, eso puede pasar con o sin buffer, lo unico que podes hacer es cuando mandas los datos del archivo es mandar un checksum (crc32,md5,etc) para aseguararte que no este corrupto el arhivo.

Teoricamente el protocolo tendria que asegurar la llegadas de todos los paquetes, pero en VB esto no pasa siempre, ocasionalmente se pierden  paquetes, mas que nada cuando se utilizan multiples sockets.

PD: podrias mirar el codigo que posteo Leandro hace unos dias para guardar la imagen en JPG asi te ahorras unos cuantos bytes en la transferencia.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

Nemutagk

Muchisimas gracias Cobein, ahora mismo checare el mensaje de Leandro, sobre lo que comentas de los paquetes perdidos tienes razon, despues de que modifique el post anterior cai en que eso es independiente del buffer, asi que con o sin el puede suceder, de nuevo muchisimas gracias!!!! ;-)