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.
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.
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............
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
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
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
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..........
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
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
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!!!!!!!!!
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