Problema transferencia de archivos con winsock

Iniciado por BeRti, 15 Abril 2006, 02:33 AM

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

BeRti

Wenas. La cosa es que no consigo hacer que funcione correctamente me estoy komiendo la kabeza y fijo que es una gilipoyez lo que me falta pero weno, a ver si me echa una mano alguien y tal.... Salu2
CLIENTE:
Private Sub command1_click()
Dim fragmento As Integer, ruta As String
Dim tamaño As Long
Dim contador As Long
Dim buffer As String
Dim archivo, lectura As String
archivo = FreeFile
contador = 0
ruta = "C:\hola.jpg"
Open ruta For Binary As #archivo
tamaño = FileLen(ruta)
ws.SendData "enviar|" & ruta & "|" & tamaño & "|"


fragmento = 8192 '8 kb


While contador < tamaño
    lectura = Input(fragmento, #archivo) 'Leer 8 kb del archiv
    ws.SendData lectura
    contador = contador + 8192
Wend
Close #archivo
End Sub



SERVIDOR:

'Declaraciones globales:
Dim transfiriendo As Boolean
Dim ruta As String * 50
Dim tamaño As Long
Dim contador As Long
Private Sub Ws_DataArrival(ByVal bytesTotal As Long)
   Dim datos As String, datos2() As String
   ws.GetData datos
   If Left(datos, 6) = "enviar" Then
   datos2 = Split(datos, "|")
   ruta = datos2(1)
   tamaño = datos2(2)
   transfiriendo = True
end sub
   End If
   If contador < tamaño Then
   If transfiriendo = True Then
   Open ruta For Binary Access Write As #1
   Seek #1, LOF(1) + 1
   Put #1, , datos
   Close #1
   End If
   contador = contador + 8192
   End If
   If contador >= tamaño Then
   transfiriendo = False
   End If
End Sub
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!

BenRu

Donde te da el error?

Nada mas verlo veo que ahi un fallo, un integer no puede almacenar 8192 '8 kb

Un saludo

BeRti

Perdón me expresé mal, keria decir que por internet no funciona bien, los archivos al llegar siempre okupan menos que el original, luego son inservibles, pero en mi pc si que lo kopia korrectamente unas veces y otras no, no lo entiendo...
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!

NYlOn

1º Como haces para provarlo con tu propia pc ?? Estas sobreescribiendo el archivo que te llega sobre el que estas mandando, no se si me explico. Vos abris el archivo C:\hola.jpg y le decis al servidor que guarde los datos que le vas a mandar en el archivo C:\hola.jpg, no crea uno nueva. Proba con esto:

ruta = "C:\hola.jpg"
Open ruta For Binary As #archivo
'Agregar la siguiente linea:
ruta = "C:\hola2.jpg"


2º Tenes un End Sub en el medio del evento DataArrival del servidor =S No se si es que copiaste mal o que.

3º Podrias provar cambiando el While por un For:

For i = 0 t Tamaño Step fragmento
    lectura = Input(i, #archivo) 'Leer 8 kb del archiv
    ws.SendData lectura
Next i




Con respecto a lo que dice BenRu es cierto que una variable del tipo Integer no puede almacenar 8192 '8 kb pero, ahi hay un apostrofe (comilla, palito) lo que estaria marcando un comentario. Por lo tanto la variable esta almacenando el numero 8192, lo que no generaria un error.

No se, fijate en estas cosas, espero que te sean utiles. Y por favor pone en que parte te marca el error, asi es mas facil ayudarte.

Un abrazo.-

BeRti

Gracias por responder NYlOn, mira es que lo de que el archivo se llama igual y lo sobreescribe es cierto pero en el proyecto lo habia cambiado, eso ya no era problema. Lo pruebo en mi propio pc ejectuando el server y el cliente y probando, y si que copia el archivo perfectamente.
El problema no es que me de errores, sino que al probarlo por intenernet con un amigo, al enviar el archivo que elija, sea hola.jpg que es un ejemplo o sea cualquier otro, nunca llega completo, siempre le faltan unos kuantos KBs, y no tengo ni idea de por que.... por cierto buena idea el for, pero me sigue pasando lo mismo :( ... yo kreo que el problema debe estar en el codigo del servidor pero no se que modificar para solucionarlo.... alguna ideA?
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!

BenRu

Y para que sirve la variable fragmento pues?

Recuerda que cuando utilizas el integer solo te recoje 8192, y se queda el 0'12 sin recojerse.

Un saludo

NYlOn

y qu hay de esto:
   transfiriendo = True
end sub
   End If


Que hace ese End Sub ahi =S??

BeRti

Vale mirad, ya he conseguido que funcione en mi pc, ejecutando el server y el cliente. pero por intenernet no funciona, siempre el archivo al llegar ocupa menos que el de origen, es komo si se perdiesen paketes.... no se por que pasa... os dejo el codigo que he conseguido hacer:

cliente: ( extraido del curso del troyano de fulano, por que el que hice yo funcionaba pero solo aveces :S)

Private Sub command1_click()
Dim ruta As String
Dim tamaño As Long
Dim buffer As String
ruta = "C:\prueba\d.zip"
'obligatorio de definir la variable si no da error
Open ruta For Binary Access Read As #1
tamaño = FileLen(ruta)
ws.SendData "enviar|" & ruta & "|" & tamaño & "|"
'abrimos el arxivo en modo binario lectura
buffer = Space$(25000)
'le decimos el espacio max que pode ocupar
For i = 1 To FileLen(ruta) / 25000
'hacemos la division de las veces que tendra que leer y enviar
Get #1, , buffer
'leemos
ws.SendData buffer
'enviamos
If FileLen(ruta) - Loc(1) <= 25000 Then
'como el for no utiliza los  decimales enviamos los restos
buffer = Space$(FileLen(ruta) - Loc(1))
'redimensianamos la variable con el num de bites que faltan
Get #1, , buffer
'leemos
ws.SendData buffer
'enviamos
End If
Next
Close #1
End Sub



servidor:


Dim transfiriendo As Boolean
Dim ruta As String * 50
Dim tamaño As Long
Dim contador As Long
Dim datosg As String
Private Sub Ws_DataArrival(ByVal bytesTotal As Long)
   Dim datos As String, datos2() As String
   ws.GetData datos
   If Left(datos, 6) = "enviar" Then
   datos2 = Split(datos, "|")
   ruta = datos2(1) & "22"
   tamaño = datos2(2)
   transfiriendo = True
   datosg = Mid(datos, Len(datos2(1)) + Len(datos2(2)) + Len("enviar||||"))
   

   Else
   If Len(datosg) <> tamaño And transfiriendo = True Then
   datosg = datosg + datos
   End If
   If Len(datosg) = tamaño And transfiriendo = True Then
   Open ruta For Binary Access Write As #1
   Put #1, , datosg
   Close #1
   transfiriendo = False
   datosg = ""
   End If
   End If
End Sub
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!

Ironhorse

Que protocolo estas usando? TCP es confiable y orientado a la conexión, UDP no es confiable y no esta orientado a la conexión (confiable quiere decir que se asegura que los paquetes lleguen, y en el orden correcto, o en todo caso si se pierde definitivamente un paquete, se sabe que el paquete se perdio).
Tal vez sea esa la causa.

Saludos
Pégense una vuelta por Cracton :)