Autor
|
Tema: Problema transferencia de archivos con winsock (Leído 3,361 veces)
|
BeRti
Desconectado
Mensajes: 63
|
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
|
|
|
En línea
|
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!
|
|
|
BenRu
The Prodigy
Desconectado
Mensajes: 4.006
|
Donde te da el error?
Nada mas verlo veo que ahi un fallo, un integer no puede almacenar 8192 '8 kb
Un saludo
|
|
|
En línea
|
|
|
|
BeRti
Desconectado
Mensajes: 63
|
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...
|
|
|
En línea
|
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!
|
|
|
NYlOn
Desconectado
Mensajes: 842
OOOOHHHHHH, TARAGÜIIII xDDDDDD
|
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.-
|
|
|
En línea
|
|
|
|
BeRti
Desconectado
Mensajes: 63
|
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?
|
|
|
En línea
|
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!
|
|
|
BenRu
The Prodigy
Desconectado
Mensajes: 4.006
|
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
|
|
|
En línea
|
|
|
|
NYlOn
Desconectado
Mensajes: 842
OOOOHHHHHH, TARAGÜIIII xDDDDDD
|
y qu hay de esto: transfiriendo = True end sub End If
Que hace ese End Sub ahi =S??
|
|
|
En línea
|
|
|
|
BeRti
Desconectado
Mensajes: 63
|
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
|
|
|
En línea
|
Lo unico mayor que el amor a la libertad es el odio, el odio a kien te la kita!
|
|
|
Ironhorse
Desconectado
Mensajes: 150
|
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
|
|
|
En línea
|
Pégense una vuelta por Cracton
|
|
|
|
|