Oppure

Loading
19/05/08 20:43
acromangelo@libero.it
Ho provato in qualsiasi modo possibile immaginabile a sfruttare il winsock per l'invio dei files ma niente ogni volta la stessa cosa....

mentre nel client ( quello ke invia ) l'ipotetica barra di scorrimento finisce subito comunicandomi dell'avvenuto invio del file ( circa 2 secondi ) nel server la barra sta ancora andando e cioè il file non è ancora arrivato!

per spiegarmi meglio vedo la lucetta del mio router che continua a lampeggiare quindi sta trasferendo byte ma nel programma mi dice che ha già finito

tipo questo codice:
Public Function Send_File(FileToSend As String)
Dim temp As String, inviati As Double, completo As Double, BlockSize As Long

Open FileToSend For Binary Access Read As #1

Label4.Caption = "Invio del file in corso..."
BlockSize = 2048
completo = LOF(1)
inviati = completo / 2048

Do While Not EOF(1)

temp = Space$(BlockSize)
Get 1, , temp
Winsock1.SendData temp

barrainvio.Max = completo
barrainvio.Min = 0
If (barrainvio.Value + 2048) < completo Then
barrainvio.Value = barrainvio.Value + 2048
ElseIf barrainvio.Value = completo Then
barrainvio.Value = completo
ElseIf (barrainvio.Value + 2048) > completo Then
barrainvio.Value = completo
End If
DoEvents
Loop
Close #1
DoEvents

Sleep (1000)
Winsock1.SendData "xx"
Label4.Caption = "Invio del file completato con successo!"
Text3.Text = ""
Command3.Caption = "Invia la richiesta"

End Function


questa l'ho fatta io

se volete potete usarla..funziona ma come vi ho detto la barra finisce subito e mi viene fuori file inviato! invece lo sta ancora trasferendo.

un aiuto su come sincronizzare l'effettivo trasferimento con il programma?

EDIT: volevo dire anche che a causa di quest problema l'ultimo comando per la chisura del file non arriva mai...e quindi il programma nn chiuderà mai il file...sempre a causa che il client lo invia dopo 2 secondi invece il ricevente dovrebbe ricevere questo comando dopo 30 sec ( dico cosi per fare un esempio ) quindi succede ciò che ho detto

Vi ringgrazio se saprete aiutarmi
ciao
Ultima modifica effettuata da acromangelo@libero.it 19/05/08 20:54
aaa
19/05/08 21:49
gantonio
Se non ho capito male il problema lo hai nel codice che riceve ... ma non l'hai mostrato ...
aaa
20/05/08 12:59
acromangelo@libero.it
il codice che riceve è questo:
Dim temp As String, data As String, dati() As String, richiesta As String, kilob() As String, kilobyte As Double

Winsock1.GetData data 'Get the data
temp = data

If InStr(temp, "///DATIFILE") Then
ricevuti = 0
dati = Split(temp, "|")
dimensione.Caption = dati(2)
nomefile.Caption = dati(1)
accettare.Visible = True
si.Visible = True
no.Visible = True
kilobyte = dati(2) / 1024
If InStr(kilobyte, ",") Then
kilob = Split(kilobyte, ",")
Label3.Caption = kilob(0) & " Kb"
Else
Label3.Caption = kilobyte & " Kb"
End If
Text4.Text = App.Path

ElseIf temp = "xx" Then
Close #2
FileOpen = False
barraricezione.Value = 0
Label4.Caption = "Ricezione del file completato con successo!"
barraricezione.Visible = False

ElseIf temp = "Paaaaaaaaaarti" Then
Label4.Caption = "Richiesta accettata, premi Invia per inviare"
Command3.Caption = "Invia il file"
barrainvio.Value = 0

ElseIf InStr(temp, "$messaggio") Then
messaggio = Replace(temp, "$messaggio ", "")
If Text5.Text = "" Then
Text5.Text = "--> " & messaggio
Else
Text5.Text = Text5.Text & vbCrLf & "--> " & messaggio
Text5.SelStart = Len(Text5.Text)
End If

ElseIf temp = "Non accetto il file" Then
Label4.Caption = "L'utente non ha accettato il file"
Command3.Caption = "Invia la richiesta"

Else

If FileOpen = False Then
Open nomefile.Caption For Binary Access Write As #2
FileOpen = True
ElseIf FileOpen = True Then
End If

Label4.Caption = "Ricezione del file in corso..."
barraricezione.Max = dimensione.Caption
barraricezione.Min = 0
If (barraricezione.Value + 2048) < dimensione.Caption Then
barraricezione.Value = barraricezione.Value + 2048
ElseIf barraricezione.Value = dimensione.Caption Then
barraricezione.Value = dimensione.Caption
ElseIf (barraricezione.Value + 2048) > dimensione.Caption Then
barraricezione.Value = dimensione.Caption
End If
Put 2, , temp

End If




ti sbagli l'errore sta nel client che è come se inviasse tutto in 2 secondi ma in realtà l'invio dura di piu...
Ultima modifica effettuata da acromangelo@libero.it 20/05/08 13:02
aaa
20/05/08 13:27
antometal
forse evi mettere alla fine
dimensione.caption=dimensione.caption+2048
aaa
20/05/08 13:45
acromangelo@libero.it
forse non mi sono spiegato bene...
sarà meglio postare un altro codice simile ma molto piu kiaro e guardate che la barra era un esempio per farvi capire che finiva subito >.<

Quello che invia:

Dim chunk As Long, file as string, datafile as string
file = App.Path & "\file.mp3"
 
 Open file For Binary Access Read As #1
Winsock1.SendData "nome-file.mp3"
 Sleep (100)
 DoEvents
 chunk = 4000

  Do While Not EOF(1)
     datafile = Space$(chunk)
     Get 1, , datafile
     Winsock1.SendData datafile
     DoEvents
  Loop
  
  Close #1
  Sleep (1000)
  Winsock1.SendData "fine"


E quello che riceve:

Dim data As String, nome as string
Winsock1.GetData data

On Error Resume Next

If InStr(data, "dimensione") Then
nome = Replace(data, "nome-", "")
Open App.Path & "\" & nome For Binary Access Write As #2

ElseIf data = "fine" Then
Close #2

Else
Put 2, , data

End If


Commentiamo questo codice che è piu chiaro...
Ultima modifica effettuata da acromangelo@libero.it 20/05/08 13:46
aaa
20/05/08 13:56
gantonio
Ah ... ora ho capito meglio il tuo problema ...

Non e' un problema del codice ...

E' il TCP che funziona in questo modo ...

L'invio e' bufferizzato ed asincrono e quindi il tuo processo client non puo' mai essere "sincronizzato" con il server a meno che non lo faccia tu tramite un protocollo di

invio ->
<- conferma
aaa
20/05/08 14:00
acromangelo@libero.it
ecco proprio questo!!! sto maledettissimo buffer del cavolo!

invio conferma mmm ho provato a sfruttare la dimensione del file dicendogli di kiuderlo quando aveva raggiunto tale dimensione ma neanke cosi va visto ke sono sempre file diversi e poi fa altri casini...

in questo momento nn mi viene in mente niente...pero se si riuscisse a capire sarebbe una svolta visto ke tutte le mie applicazioni ke utilizzano tcp/ip sfruttano invio dei files >_>: chat multiutente, scambio dei files, web cam nascosta, e via dicendo...
aaa
20/05/08 14:31
gantonio
Web cam nascosta?
aaa