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
Donde te da el error?
Nada mas verlo veo que ahi un fallo, un integer no puede almacenar 8192 '8 kb
Un saludo
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...
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.-
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?
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
y qu hay de esto:
transfiriendo = True
end sub
End If
Que hace ese End Sub ahi =S??
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
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