Oppure

Loading
11/06/08 18:36
feddur
Postato originariamente da gantonio:

Comincio a non capire ...

Come hai fatto a vedere che il file spedito era di 33k e ricevuto da 39k?

Ma tu il codice del server per ricevere ce l'hai?


ho visto le proprità dei due file.
questo è il codice che ho provato, purtoppo non l'ho fatto io perchè ancora non ci riesco, spero di imparare.


Private Sub client_DataArrival(ByVal bytesTotal As Long)
    Dim data As String, Dimensione As Double
    client.GetData data
        If InStr(data, "dimensione") Then
        tempo = True
        Label3.Caption = "Trasferimento..."
            Dimensione = Replace(data, "dimensione-", "")
            Open App.Path & "/" & "foto.bmp" For Binary Access Write As #2
        ElseIf data = "fine" Then
            Label3.Caption = "Trasferito"
            Close #2
            client.SendData "invia"
            Label3.Caption = "Richiesta trasferimento"
        Else
            Put 2, , data
        End If
End Sub
Ultima modifica effettuata da feddur 11/06/08 18:37
aaa
11/06/08 18:49
P4p3r0g4
ti faccio uno schema
A server
B client

(B vole trasmettere il file ad A)

utente avvia il processo di invio
B immagazzina il percorso del file
B apre il file
B legge la lunghezza del file
B (se non l'ha gia` fatto) si connette ad A
B trasmette ad A "nomefile" & carattereseparatore & lunghezzafile
A riceve
A divide la stringa in nomefile e lungezzafile
A treamette a B "messaggio ricevuto"
B riceve
B inizia a inviare pezzi di file
A riceve e immagazzina la lunghezza dei dati ricevuti
B invia
A riceve e somma la lunghezza a quella precedente
..
--
..
B invia l'ultima strina e chiude il file
A riceve e somma
A nota che la lunghezza ha raggiunto la lunghezza complessiva del file
A chiude il file

Invio completato!
aaa
11/06/08 19:12
feddur
non capisco come posso dividere il file e inviarlo a pezzi.

scusate, ma vorrei proprio imparare a inviare file. 8-|

edit:
posso prendere spunto da questo?

Dim DataToSend As String
Open Filepath For Binary As #1
DataToSend = Space(4000)
For Conteggio = 0 To CLng(LOF(1) / 4000)
Get #1, Conteggio * CLng(4000) + 1, DataToSend
wsk.SendData DataToSend
DoEvents
Next Conteggio
Ultima modifica effettuata da feddur 11/06/08 19:40
aaa
12/06/08 7:50
GrG
Il file viene già spezzettato di suo...Cioè è già il programma CLIENT che divide il file in pezzi se troppo grosso e lo invia al SERVER.

Infatti il winsock invia dei pacchetti al server contenenti il codice del file da trasferire ma il pacchetto più di una certa quantità di Byte non può mandare e così anzichè uno solo ne vengono mandati più di uno ognuno contenenti un pezzo di codice...
aaa
12/06/08 9:19
feddur
c'è un modo per sapere in quanti perti spezzetta un file?
aaa
12/06/08 10:07
gantonio
Calma ... il Winsock (e il TCP) spezzano il file quando lo inviano se tu glielo mandi tutto ... (fattibile ma per grandi file hai la necessita' di allocare molta memoria e non e' conveniente).

La divisione del file di cui si parla e' "applicativa" ... quel codice sarebbe corretto, tranne per il fatto che un file non e' mai perfettamente divisibile e l'ultimo pezzo puo' essere di diversa lunghezza e bisogna tenerne conto.

Per esempio, se il file e' lungo 109288 byte e lo divido in pezzi da 4000 byte, ne avro'

27 pezzi da 4000 byte
+
1 pezzo finale da 1288 byte

Se il codice non ne tien conto, rischia di inviare piu' byte del necessario o di perdersi un pezzo di file. In questo modo la dimensione del file inviato e di quello ricevuto potrebbero essere diverse.
aaa
12/06/08 11:31
feddur
Postato originariamente da gantonio:

Calma ... il Winsock (e il TCP) spezzano il file quando lo inviano se tu glielo mandi tutto ... (fattibile ma per grandi file hai la necessita' di allocare molta memoria e non e' conveniente).

La divisione del file di cui si parla e' "applicativa" ... quel codice sarebbe corretto, tranne per il fatto che un file non e' mai perfettamente divisibile e l'ultimo pezzo puo' essere di diversa lunghezza e bisogna tenerne conto.

Per esempio, se il file e' lungo 109288 byte e lo divido in pezzi da 4000 byte, ne avro'

27 pezzi da 4000 byte
+
1 pezzo finale da 1288 byte

Se il codice non ne tien conto, rischia di inviare piu' byte del necessario o di perdersi un pezzo di file. In questo modo la dimensione del file inviato e di quello ricevuto potrebbero essere diverse.


ah, bene..
diciamo che non è il massimo dell'eleganza usare quell'algoritmo però comincio a capirlo.
potrei fare che:
-prende la lunghezza del file
-lo divide
-memorizza il numero di pezzi del file
-invia il file
-quando arriva all'ultimo pezzo chiudo il file e segnalo dall'altra parte che la trasmissione è terminata e chiudo.

pazienza se il file ha dimensioni diverse..

per ricevere come potrei fare?
basta mettere insieme tutte le parti e attendere il segnale per chiudere il file?
aaa
12/06/08 11:38
GrG
Postato originariamente da feddur:
[...]
per ricevere come potrei fare?
basta mettere insieme tutte le parti e attendere il segnale per chiudere il file?


All'ultimo pacchetto verranno aggiunti in coda al codice degli spazi..e così il file ricevuto sarà più grande del file inviato...Però funzionerà lo stesso
aaa