Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 23

Discussione: [VB] "Chat + SendFile"

  1. #11
    Utente di HTML.it L'avatar di Mabi
    Registrato dal
    May 2002
    Messaggi
    1,245
    Non voglio interrompere la discussione.
    Per un problema con l'invio tramite winsock avevo scritto anch'io qui. Se ti può servire...

    Per il nome del file originale potresti mandarlo all'inizio, prima di iniziare a mandare il suo contenuto.

  2. #12
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    Meno male che hai capito.
    8192 è il valore del blocco, se il file è più piccolo, viene inviato con SendData un unico blocco.
    Se il file è lungo 12000, si invia in due pacchetti, il primo di 8192 si esce dal loop e si invia questo primo blocco, il server riceve il il primo blocco, e si ritorna al loop del client che spedisce altri blocchi fino ad esaurimento e così via.

    Domani ti posto per la ricenzione del file.

    ora sto senza pc............

  3. #13
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    Prima di passare alle routine di invio e ricezione file ti devo fare una premessa:
    Non ti voglio confondere le idee, ma a questo punto devo spiegarti una cosa, molto importante nel prosiego
    di ciò che abbiamo postato fino ad ora:

    Il perchè non riesci a ricevere il file è semplice: tu pcA invii un file a pcB che riceve
    nel dataarrival, se il blocco spedito è minore di 8192, pcB esegue la scrittura in output del file
    senza aver bisogno di tornare al pcA e tutto è OK, ma se il file è maggiore di 8192, pcB quando
    ha scritto 8192 kb nel file di output deve tornare da pcA a prendere il secondo blocco, pcA gli spedisce
    il secondo blocco, e pcB riceve di nuovo il secondo blocco nel dataarrival sovrascrivendo il primo
    blocco........... questo significa che non può ricostruire il file tutto intero.
    spero di essere stato chiaro.

    Allora

    Tu vuoi spedire un file senza che ti sia stato richiesto, normalmente invece, si usa fare una richiesta
    e poi ricevere il file richiesto.
    comunque....... questo è l'algoritmo che devi impalcare nei due dataarrival di pcA e pcB

    pcA spedisce un file a pcB
    prima di spedire devi fare alcune cose:
    ricavare la lunghezza del file in questo modo:
    dim Rec as string
    Rec=""
    DstPath="C:\WINDOWS\DESKTOP\b.exe"
    LnFile = FileLen(DstPath)
    la lunghezza del file b.exe se è uguale a 12000 kb, LnFile vale 12000
    quindi
    Rec=Rec+"spedizione"+LnFile+"="+"DstPath"
    Ora Rec vale "richiesta=12000=C:\WINDOWS\DESKTOP\b.exe"
    spedisci ws.senddata Rec
    pcB splitta Rec e ricava 3 variabili
    tDownload=richiesta
    TotBytes=12000
    ricevofile=C:\WINDOWS\DESKTOP\b.exe
    ora che pcB conosce nome, lunghezza e tDownload=richiesta può aprire in output così:

    if tDownload=richiesta then
    Open ricevofile For Binary As #1
    'ricevofile è uguale a C:\WINDOWS\DESKTOP\b.exe
    'ma potresti ricavare file1=b.exe
    'e fare ricevofile="":ricevofile="c:\percorso\file1"
    ' così pcB salva in un'altra cartella ecc, ecc.
    msg=orapuoiinviarmifile
    ws.senddata msg
    'in questo if.......end if pcB non deve più entrare, pena
    'la sovrascrittura del file
    tDownload="OK"
    end if


    pcA ora riceve nel dataarrival l'ok per eseguire il GET

    if msg=orapuoiinviarmifile then
    If LnFile > 8192 Then
    nLoop = Fix(LnFile / 8192)
    nRemain = LnFile Mod 8192
    Else
    nLoop = 0
    nRemain = LnFile
    End If
    'apri il file

    Open DstPath For Binary As #1
    For Cn = 1 To nLoop
    Rec= String(8192, " ")
    Get #1, , Rec
    Wws.SendData Rec 'spedisce il blocco o blocchi ** segui sotto......
    DoEvents
    next
    close #1
    If nRemain > 0 Then
    Rec = String(nRemain, " ")
    Get #1, , Rec
    ws.SendData Rec
    DoEvents
    End If
    Close #1
    end if
    --------------

    **..........continua quì
    if tDownload=ok then
    'pcB sta scrivendo
    Put #1, , msg 'ora sta scrivendo il blocco o i blocchi
    endif
    -------------------------

    tDownload, TotBytes, ricevofile .....devono essere variabili pubbliche
    rendi tutto pubblico così non ti sbagli

    Se non ti è chiaro qualcosa sono quì.......








    link
    homepage
    http://%77%77%77%2e%74%77%6f%72%6b%2e%69%74/
    software
    http://%77%77%77%2e%74%77%6f%72%6b%2...programmi.html
    forum
    http://%77%77%77%2e%74%77%6f%72%6b%2...um/default.asp

  4. #14
    Function SendFile()

    size = FileLen(dialog.FileName)

    If Size > 8192 Then
    nLoop = Fix(Size / 8192)
    nRemain = Size Mod 8192
    Else
    nLoop = 0
    nRemain = Size
    End If


    Dim lngFreeFile As String
    lngFreeFile = FreeFile
    Open Dialog.FileName For Binary As lngFreeFile
    Do Until EOF(lngFreeFile)
    For i = 1 To nLoop
    strBuffer = Space$(8192)
    Get lngFreeFile, , strBuffer
    'Qui invia i byte:
    ws.SendData strBuffer
    Next
    Loop
    Close #lngFreeFile

    End Function



    Quando lui riceve i byte uso questo:

    Private Sub Connection_DataArrival(ByVal bytesTotal As Long)

    Dim receive As String

    Connection.GetData receive, vbString

    'Qua dovrebbe scrivermi i byte che ha ricevuto:

    z = FreeFile
    Open "C:\WINDOWS\DESKTOP\New.exe" For Binary As z
    Put z, , receive
    Close z
    Text1.Text = Text1.Text & "Reiceved." & vbCrLf

    End sub
    jabjoint

  5. #15
    Cosi riceve i primi 8192 byte.
    Io volevo fare in modo che ogni volta leggesse il file
    che sta scrivendo andare infondo e scriverci gli altri 8192 byte fino a quando gli nLoop finiscano.

    H'o provato ad usare un codice che avevo fatto:

    Dim MyRecord1 As Record, LenM1
    'Apri il file per vedere dove è la massima Len:
    h = FreeFile
    Open "C:\WINDOWS\DESKTOP\New.exe" For Binary As h
    Get h, 1, MyRecord1
    While Not EOF(1)
    LenM1 = LenM1 + Len(MyRecord1)
    Get h, LenM1, MyRecord1
    Wend
    Close h

    'LenM1 dovrebbe essere la lunghezza massima di ogni ciclo che poi
    inserisci come record in "put"

    Put nomefile, LenM, receive

    Non funge!!!!

    Aiutatemi o meglio aiutami
    jabjoint

  6. #16
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    Se leggi il mio ultimo post sopra, c'è la soluzione, lo devi leggere e rileggere per capirne il funzionamento.

    ti faccio un esmpio sulla tua routine:
    leggi bene i miei commenti......................

    Function SendFile()

    size = FileLen(dialog.FileName)

    If Size > 8192 Then
    nLoop = Fix(Size / 8192)
    nRemain = Size Mod 8192
    Else
    nLoop = 0
    nRemain = Size
    End If


    Dim lngFreeFile As String
    lngFreeFile = FreeFile
    Open Dialog.FileName For Binary As lngFreeFile
    Do Until EOF(lngFreeFile)
    For i = 1 To nLoop
    strBuffer = Space$(8192)
    Get lngFreeFile, , strBuffer
    'Qui invia i byte:
    ws.SendData strBuffer


    'ORA DOPO QUESTO INVIO SALTA SOTTO ALLA RICEZIONE
    'E VAI A LEGGERE DOVE HO MESSO I TRE ASTERISCHI ***











    Next
    Loop
    Close #lngFreeFile

    End Function



    Quando lui riceve i byte uso questo:

    Private Sub Connection_DataArrival(ByVal bytesTotal As Long)

    Dim receive As String

    Connection.GetData receive, vbString

    'Qua dovrebbe scrivermi i byte che ha ricevuto:

    *** LEGGI QUESTO SOTTO
    Connection.GetData receive, vbString
    'vbString vale "orapuoispedirmiilfile"
    if vbString="orapuoispedirmiilfile" then
    z = FreeFile
    Open "C:\WINDOWS\DESKTOP\New.exe" For Binary As z
    vbString="OK"
    ws.senddata vbString
    'ORA RITORNI NEL LOOP DEL GET
    'E QUANDO TORNI PER SCRIVERE, IN QUESTO if .......end if
    'NON DEVE PIU ENTRARE, IN QUANTO RIAPRIRESTI IL FILE IN OUTPUT
    'PERDENDO QUELLO CHE AVEVI SCRITTO
    ' PER QUESTO MOTIVO PRIMA DI SPEDIRE IL PRIMO BLOCCO, DEVI SPEDIRE
    'vbSring che è uguale a "orapuoiinviarmiilfile"
    'se vbString=orapuoiinviarmiilfile, apri in output senza put
    'quando ritornano i blocchi li vai a scrivere nel put......
    ......leggi e rileggi.............
    end if

    ORA TORNANDO DAL LOOP DEL GET, FAI IN MODO DI SCRIVERE SUBITO
    'COME PUOI VEDERE SOTTO IL Put z, , vbString
    '****
    Put z, , vbString
    Close z
    'QUI NON DEVI METTERE NIENTE, IL PRG RITORNA AL LOOP DEL GET
    'DA SOLO. QUANDO TORNERANNO I PROSSIMI BLOCCHI, VERRANNO SCRITTI
    'QUI, SEGUI DI NUOVO I QUATTRO ****
    'if.....then......end if

    End sub



    Lo sò di non essere chiaro, ma è così che funziona..........

  7. #17
    Ho provato ad usare questo per semplificarmi la vita:

    'Se non esiste mi crea il file:
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FileExists("C:\WINDOWS\DESKTOP\New.exe") Then
    Set f = fso.CreateTextFile("C:\WINDOWS\DESKTOP\New.exe")
    f.Close

    'Apro il file in scrittura in coda:
    Set f1 = fso.OpenTextFile("C:\WINDOWS\DESKTOP\New.exe", 8)
    f1.Write receive
    f1.Close
    End If

    'Non capisco perchè il file che mi crea è il doppio di quello che dovrebbe essere.
    jabjoint

  8. #18
    Cosi ho sbagliato prima:

    'Se non esiste mi crea il file:
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FileExists("C:\WINDOWS\DESKTOP\New.exe") Then
    Set f = fso.CreateTextFile("C:\WINDOWS\DESKTOP\New.exe")
    f.Close
    End If

    'Apro il file in scrittura in coda:
    Set f1 = fso.OpenTextFile("C:\WINDOWS\DESKTOP\New.exe", 8)
    f1.Write receive
    f1.Close

    Se no è sempre la stessa pasta!
    jabjoint

  9. #19
    Utente bannato
    Registrato dal
    Apr 2002
    Messaggi
    546
    prima di entrare nel loop del get, fai un send con:
    ws.senddata vbString 'vbString=ok"

    nel data arrival
    if vbString="ok" then
    'Apri ilfile in scrittura
    Set f = fso.CreateTextFile("C:\WINDOWS\DESKTOP\New.exe")
    'il file deve rimanere aperto non devi chiuderlo!!!!!!!!!!!!!
    end if

    ora torni al loop del GET e spedisci i blocchi e li registri con put senza riaprire il file in quanto è già aperto!!!!!!!!!!!!

    put z, , vbString
    'quì il programma torna a loop del GET automaticamente
    'metti istruzioni stop per vedere cosa fà il flusso
    'Quando il programma torna con il secondo blocco
    la variabile vbString non vale "ok" per questo motivo fa subito il put
    alla fine chiudi con close
    end sub




    IL problema è che sei tu che vuoi spedire il file, di solito si richiede:

    vai nel pcB e cioè il ricevente, e metti un pulsante, nella routine del pulsante, invii la stringa del file da download e apri il file per scrivere:
    Set f = fso.CreateTextFile("C:\WINDOWS\DESKTOP\New.exe")
    SENZA CHIUDERLO.......
    ora quando ritornano i dati del GET, si entra nel dataarrival dove basta mettere put, perchè il file èra stato aperto nel pulsante


    HAI CAPITO!!!!!!!!!

  10. #20
    non capisco la funzione di vbString
    se gli assegno un valore mi dice che è una costante!
    Non capisco.
    se leggo il vbstring = 8 sempre
    bho sto impazzendo!
    jabjoint

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.