acromangelo@libero.it (Normal User)
Rookie
Messaggi: 21
Iscritto: 23/03/2008
|
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:
Codice sorgente - presumibilmente VB.NET |
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 il 19/05/2008 alle 22:54 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Se non ho capito male il problema lo hai nel codice che riceve ... ma non l'hai mostrato ...
|
|
acromangelo@libero.it (Normal User)
Rookie
Messaggi: 21
Iscritto: 23/03/2008
|
il codice che riceve è questo:
Codice sorgente - presumibilmente VB.NET |
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 il 20/05/2008 alle 15:02 |
|
antometal (Member)
Guru
Messaggi: 691
Iscritto: 12/09/2007
|
forse evi mettere alla fine
dimensione.caption=dimensione.caption+2048
|
|
acromangelo@libero.it (Normal User)
Rookie
Messaggi: 21
Iscritto: 23/03/2008
|
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:
Codice sorgente - presumibilmente Delphi |
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:
Codice sorgente - presumibilmente VB.NET |
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 il 20/05/2008 alle 15:46 |
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
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
|
|
acromangelo@libero.it (Normal User)
Rookie
Messaggi: 21
Iscritto: 23/03/2008
|
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...
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Web cam nascosta?
|
|
acromangelo@libero.it (Normal User)
Rookie
Messaggi: 21
Iscritto: 23/03/2008
|
nel senso che il server mi invia l'immagine della web cam in modo nascosto...per quello che dicevo web cam nascosta
comunque qualche idea?
|
|