solo logro hacer transferencia de archivos de menos de 2mb, que puedo hacer?

Iniciado por Proxy Lainux, 8 Junio 2008, 11:34 AM

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

Proxy Lainux

hola

haber si me pueden ayudar.. lo que pasa es que estaba haciendo que mi programa de transferencia de archivos funcionara... lei el manual de eon sobre eso... solo que yo utilice el winsock.ocx y la api csocketmaster...

cuando lei el manual logre entender lo que hizo eon, y lo hice como pude con el cliente y funciono bien, pero cuando mando al server algun archivo solo logro enviar un archivo  de no mas de 2mb... sera acaso por la api que sucede eso?, ya que eso apenas lo intentare, utilizare el ocx en el server para ver si me hace lo mismo, pero por ahorita intente hacer varias cosas e incluso quise hacerlo exactamente como lo hizo E0N, pero no lo logro...

alguien sabe si hay problemas con la api csocketmaster para transferencia de archivos?... o que puede estar pasando que solo logro enviar archivos pequeños al server...?

espero me puedan ayudar.. gracias  ;D

Xerok1!

Pues según parece tienes que partir el archivo en partes y enviarlas, pero así sin más información no te puedo decir seguro..Te sale algún tipo de error o algo?

Un saludo :-\
[Firma]Esperando haber si acaba el concurso de firmas y la pongo[/Firma]

~~

Hola Proxy Lainux

No creo que sea problema de usar el csocketmaster o no usarlo. Por lo que dices (qunque sin ver código dificil juzgar) no debes estar enviando bien los archivos. Mirate el código de un File Manager que puse por el foro (en un post con chincheta tienes el enlace, o si no busca en google [Source] File Manager completo by E0N" o algo así :P) y verás como tienes que envarlo.

La idea es la siguiente, imaginemos que desde el cliente (lo que manejas en tu Pc) quieres que el server (lo que está en el Pc remoto, por aclara xD) quieres descargarte el archivo C:\hola.txt de 2500 bytes de tamaño y guardarlo en C:\recibido.txt (en tu Pc), pues la cosa sería así:

  • El cliente envia la orden de descargar el archivo, por ejemplo envia "descargar|C:\hola.txt"
  • El servidor lee dicho archivo y le envia al cliente esto por ejemplo: "leidoOK|2500" siendo 2500 su tamaño
  • El cliente almacena el valor 2500 y activa un "interruptor", es decir, al inicio del DataArrival pones un If interruptor = true... y dentro haces que todos los datos que te vayan llegando los meta en el archivo recibido, es decir, en C:\recibido.txt. A continuación manda un comando para que el server empiece a enviar el archivo, por ejemplo envia "mandar_archivo"
  • El servidor manda el archivo.
  • El cliente va metiendo todo lo que reciba en C:\recibido.txt hasta que el tamaño de C:\recibido.txt sea igual al tamaño que a recibido anteriormente, es decir 2500 bytes. Cuando lo tenga todo pone en false el interruptor y listo, ya puedes hacer que el "troyano" o lo que sea reciba sus órdenes con normalidad.

    Esa es la idea, en el File Manager que te mencionaba antes tienes el código.

    Salu2 E0N

yovaninu

Cita de: E0N en  8 Junio 2008, 16:50 PM
  • El servidor lee dicho archivo y le envia al cliente esto por ejemplo: "leidoOK|2500" siendo 2500 su tamaño
  • El cliente almacena el valor 2500 y activa un "interruptor", es decir...

  • El cliente va metiendo todo lo que reciba en C:\recibido.txt hasta que el tamaño de C:\recibido.txt sea igual al tamaño que a recibido anteriormente, es decir 2500 bytes.
Habria alguna forma de evitar que tenga que hacerse primero eso?, es decir no tener que hacer el "ida y vuelta" antes de empezar la transferencia del archivo.

~~

Pidiendo el archivo desde el cliente y poniendo el interruptor en true directamente por ejemplo y parar de leer cuando se envie la cadena "FIN ARCHIVO" por ejemplo, es una opción, se puede hacer de muchas formas esto, hay más metodos tb explicados por el foro ;)

Proxy Lainux

hola

gracias por las respuestas..

pero miren, e intentado descargar archivos desde el server hacia el cliente y de mas de 20 mb y todo va perfecto... pero cuando kise hacer que el cliente envie un archivo al server como les mencione anteriormente y llego a enviar algo de mas de 2 mb, ya no se guarda, la unica diferencia es que en el server ya no use cd.ShowSave... el codigo que hice esta basado en el ejemplo de Filemanager by E0N... y me he dado cuenta de que el cliente envia mas bits del archivo original... asi que intente hacer lo mismo que hizo E0N para saber porke no estaba funcionando, en cierta forma copie o transcribi el codigo del ejemplo y el cliente sigue enviando bits de mas...

esto es lo que hago...


es es de un form6 del cliente

Form1.cd.DialogTitle = "Archivo a enviar"
Form1.cd.ShowOpen
Label3.Caption = Form1.cd.FileName
trem = Split(Form1.ListView1.SelectedItem.key, "|")
Form1.ws(trem(0)).SendData "envarc|" & FileLen(Form1.cd.FileName) & "|" & Text1.Text & Form1.cd.FileTitle

servidor

case envarc
arev = todo(1)este guarda filelen
arevs = todo(2) este guarda la direccion de donde quiero que se guarde y el nombre del archivo
dat = ""
ws.SendData "now"

form1 cliente

Case "now"
Open Form6.Label3.Caption For Binary As #1
nos = Space(LOF(1))
Get #1, , nos
Close #1
spb = Split(ListView1.SelectedItem.key, "|")
ws(spb(0)).SendData nos
Form6.Label3.Caption = ""

tambien intente hacer esto pero tampoco funciono
for o = 1 to len(nos)
cadena = mid(nos,o,10)
o=o+9
spb = Split(ListView1.SelectedItem.key, "|")
ws(spb(0)).SendData cadena
Sleep 1
next o

servidor

If arev <> "0" Then
tdata = tdata + dat
If Len(tdata) = arev Then
Open arevs For Binary As #1
Put #1, , tdata
Close #1
arev = 0
tdata = ""
arevs = ""
End If
End If

si se dan cuenta acabe haciendo casi un copy paste del codigo pero no me funciono


LeandroA

hola te pongo un ejemplo de como enviar un archivo en trozos, claro que tenes que poner la parte del tamaño y bueno vos sabes.


Dim Pos As Long
Dim Segment As Long
Dim SegmentCount As Long
Dim LenRest As Long
Dim SendFileComplete As Boolean
Dim FreeF As Integer
Const Buffer = 4096
Dim SendingFile As Boolean
Dim FileData() As Byte

Private Sub SendFile(ByVal FileName As String)
Dim LenFile As Long
Dim TotInteger As Long

LenFile = FileLen(FileName)
SegmentCount = Val(LenFile / Buffer)
TotInteger = SegmentCount * Buffer
LenRest = LenFile - TotInteger
Segment = 0
Pos = 1

ReDim FileData(Buffer - 1)
SendingFile = True
SendFileComplete = False
Open FileName For Binary Access Read As #FreeF

call SendNextSegment

End Sub

Private Sub objWinSock_SendComplete()
If SendingFile Then SendNextSegment
End Sub


Private Function SendNextSegment()

If objWinSock.State = 7 Then
    If SendFileComplete Then
        SendingFile = False
        Call CloseConection 'funcion que cierra la conexion o termino el envio del archivo
        Exit Function
    End If
     
    If Segment = SegmentCount Then
            If LenRest > 0 Then
                ReDim FileData(LenRest - 1)
                Get FreeF, Pos, FileData
                Close #FreeF
                SendFileComplete = True
                If objWinSock.State = 7 Then objWinSock.SendData FileData
   
            End If
        Else
            Get #FreeF, Pos, FileData
            If objWinSock.State = 7 Then objWinSock.SendData FileData
            Pos = Pos + Buffer
        End If
   
    Segment = Segment + 1
End If
End Function