Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Aiuto per Lista Directories tramite winsock
Forum - Visual Basic 6 - Aiuto per Lista Directories tramite winsock

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
gmxsm (Normal User)
Newbie


Messaggi: 20
Iscritto: 06/12/2007

Segnala al moderatore
Postato alle 1:05
Giovedì, 06/12/2007
Salve a tutti,
è da un bel po di tempo che visito questo sito ed in particolare la sezione del forum su VB, cercando di "captare" quando più possibile dai vari post..
Da ieri però ho cominciato a sbattere la testa contro uno dei 4 muri di casa e, prima di abbaterlo ed essere quindi sbattuto fuori casa dai miei :D, ho deciso di chiedere aiuto a chi più di me ne sa..

Il problema che mi sono trovato davanti è il seguente:
Sto creando un'applicazione che dovrebbe permettere di fare varie operazioni su un pc in remoto, tra cui l'elenco delle directories e dei files..
Per fare questo ho usato un winsock e una variabile tipo stringa che uso per passare l'intera lista delle directories..Tutto sembrava funzionare fino a che noto che esplorando le cartelle contenute in "Programmi", queste vengono tagliate; nel senso che il winsock taglia la variabile in 2 parti e le manda separatamente..
Dato che ho messo un identificatore all'inizio della variabile, in modo da sapere cosa c'è dentro(se directories,files,semplici stringhe ecc) in modo da inserirla in opportuni controlli(listbox,combobox,textbox...)
quando ricevo la seconda parte della variabile, non essendoci l'identificatore all'inizio, non riconosce il "tipo" di dati che contiene la stringa, quindi le cartelle non vengono inserite nel loro opportuno controllo. Posto un pezzo del codice interessato:

Nel client:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub WS_DataArrival(ByVal bytesTotal As Long)
  2. On Error GoTo errore
  3. Dim data As String
  4. Dim dimensione As Long
  5. Dim analizzadata() As String
  6. WS.GetData data
  7. analizzadata = Split(data, vbCrLf)
  8. If UBound(analizzadata) > 1 Then
  9. dimensione = analizzadata(1)
  10. dimensioneData = bytesTotal
  11. 'MsgBox bytesTotal & "=" & dimensione
  12. End If
  13. Select Case analizzadata(0)
  14. Case "ListaDrives" 'caso lista dei drives
  15. For i = 2 To UBound(analizzadata) - 1
  16. ComboDrive.AddItem (analizzadata(i))
  17. Next
  18. ComboDrive.Text = "Seleziona Drive:"
  19. Case "ListaDir" ' caso lista delle directories
  20. ListDir.Clear
  21. For i = 2 To UBound(analizzadata) - 1
  22. ListDir.AddItem (analizzadata(i))
  23. Next
  24. Call cmdMostraFiles_Click
  25. Case "ListaFile" 'caso lista dei files
  26. ListFiles.ListItems.Clear
  27. For i = 2 To UBound(analizzadata) - 1
  28. ListFiles.ListItems.Add , , analizzadata(i)
  29. Next
  30. Case "Disconnesso"
  31. Call cmdConnetti_Click
  32. Case Else
  33. MsgBox data
  34. End Select
  35. Exit Sub
  36. errore:
  37. MsgBox Err.Description
  38. End Sub


Il server invia un tipo di stringa del tipo:
Codice sorgente - presumibilmente Plain Text

  1. ListaDir 'il tipo di dati inviati
  2. 2340 ' la dimensione della stringa inviata
  3. dir1 'inizia l'elenco delle directories
  4. dir2
  5. dir3
  6. .
  7. .
  8. .


----------------------------------------------------
Spero di aver spiegato al meglio la situazione in cui mi trovo anche perchè telematicamente è difficile..:asd: in caso chiedete.. Ciauz ;)

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 7:52
Giovedì, 06/12/2007
Hai fatto un errore di fondo, che e' quello che tutti commettono quando iniziano a programmare con la rete e i socket.

Hai dato per scontato che i dati siano ricevuti in blocco da un socket cosi' come sono trasmessi nell'altro socket. Questo NON e' affatto vero.

Il protocollo TCP garantisce SOLO che i dati arrivino e che siano nell'ordine corretto, MA e' padrone di "spezzarli" ed inviarli in quantita' che piu' ritiene opportune. Questo succede per diversi motivi, tra cui il fatto che le dimensioni dei pacchetti che viaggiano in rete, sono limitati e la "ricomposizione" avviene nel client.

Devi quindi "pensare" al tuo programma in modo diverso considerando che invii una testata con il numero dei byte trasmessi, fai in modo che questi siano TUTTI ricevuti prima di considerare che il prossimo blocco abbia una sua testata.

Cioe', se ricevi 2437 all'inizio del primo pacchetto, continua a ricevere dati fino a completare i 2437 byte e solo dopo considera che il prossimo numero rappresenta il nuovo pacchetto.
Ma fai ATTENZIONE al fatto che i 2437 byte si potrebbero completare nel bel mezzo di una stringa e che il prossimo pacchetto dei tuoi dati potrebbe iniziare proprio lì.

Per tentare di capirci, ad esempio, potresti avere delle chiamata alla Receive che ti forniscono pacchetti del tipo

1)  ListaDir3299....
2)  ....ListaDir2883...
3)  ....File2787...

e devi essere tu a districarti tra i vari dati.
In genere si usa una "macchina a stati" per farlo, ma non e' complesso.

Ultima modifica effettuata da gantonio il 06/12/2007 alle 7:56
PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 14:44
Giovedì, 06/12/2007
Io uso ragionare diversamente.
piuttosto che segmentare gli invii occupo totalmente l'invio (anche con l'utilizzo di spazi vuoti e caratteri nulli)
oppure (se posso) gli passo un "doevents" che mi invia il pacchetto in maniera corretta.
Certo che è un po più lento ma di solito i file (che sono gli invii "massicci") occupano totalmente + invii e gli altri non hanno bisogno di "immediatezze" della differenza di 1/100 di secondo.

Ultima modifica effettuata da P4p3r0g4 il 06/12/2007 alle 14:47
PM Quote
Avatar
gmxsm (Normal User)
Newbie


Messaggi: 20
Iscritto: 06/12/2007

Segnala al moderatore
Postato alle 16:57
Giovedì, 06/12/2007
Testo quotato


Hai dato per scontato che i dati siano ricevuti in blocco da un socket cosi' come sono trasmessi nell'altro socket. Questo NON e' affatto vero.


In effetti appena ho visto ciò che accadeva me ne sono reso conto :D e da qui ho realizzato che dovevo cambiare metodo utilizzando la dimensione dei pacchetti inviati dal server verso il client...

Testo quotato


In genere si usa una "macchina a stati" per farlo, ma non e' complesso.


Su internet ho trovato questo:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=15300
Anche essendo in .net,onestamente non ho capito nulla..:-|
Potresti gentilmente farmi un esempio su come funziona?

Edit:gantonio,scusa ma rileggendo mi sono accorto di aver fatto richiesta di una cosa che precedentemente avevi già scritto :D
Testo quotato


Devi quindi "pensare" al tuo programma in modo diverso considerando che invii una testata con il numero dei byte trasmessi, fai in modo che questi siano TUTTI ricevuti prima di considerare che il prossimo blocco abbia una sua testata.

Cioe', se ricevi 2437 all'inizio del primo pacchetto, continua a ricevere dati fino a completare i 2437 byte e solo dopo considera che il prossimo numero rappresenta il nuovo pacchetto.
Ma fai ATTENZIONE al fatto che i 2437 byte si potrebbero completare nel bel mezzo di una stringa e che il prossimo pacchetto dei tuoi dati potrebbe iniziare proprio lì.


Cmq ho notato inoltre che provando ad inviare le dimensioni di una stringa, questa non corrisponde con la variabile bytesTotal del data_arrival nel winsock..
Giusto per sapere se sbaglio: il valore ritornato dalla funzione Len(stringa) non dovrebbe essere  uguale al valore di bytesTotal?

Nel frattempo di una risposta cerco ancora in giro ma penso che il problema stia nel fatto che qualcosa mi sfugge...

Ultima modifica effettuata da gmxsm il 06/12/2007 alle 18:42
PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:01
Giovedì, 06/12/2007
Testo quotato

Postato originariamente da gmxsm:Cmq ho notato inoltre che provando ad inviare le dimensioni di una stringa, questa non corrisponde con la variabile bytesTotal del data_arrival nel winsock..
Giusto per sapere se sbaglio: il valore ritornato dalla funzione Len(stringa) non dovrebbe essere  uguale al valore di bytesTotal?[/QUOTE]

Non ho capito ... qual e' il problema?

[Quote]Nel frattempo di una risposta cerco ancora in giro ma penso che il problema stia nel fatto che qualcosa mi sfugge...



Ma perche'? Ti ho risposto ... forse non sono stato chiaro ...

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 19:07
Giovedì, 06/12/2007
Testo quotato

Postato originariamente da P4p3r0g4:

Io uso ragionare diversamente.
piuttosto che segmentare gli invii occupo totalmente l'invio (anche con l'utilizzo di spazi vuoti e caratteri nulli)
oppure (se posso) gli passo un "doevents" che mi invia il pacchetto in maniera corretta.



Scusa ... ma come non "segmenti" un file AVI da 800 M ?

E a cosa serve un DoEvents eseguito su un client quando chi riceve, il server, ottiene i dati in piu' parti "indipendentemente" da come sono stati spediti dal client (per le note caratteristiche del protocollo TCP)?

Testo quotato


Certo che è un po più lento ma di solito i file (che sono gli invii "massicci") occupano totalmente + invii e gli altri non hanno bisogno di "immediatezze" della differenza di 1/100 di secondo.



Non ho capito nulla ...

Il fatto e' che tu, dal processo che spedisce dati con TCP, NON HAI alcun controllo sullo "spettezzamento" dei dati in arrivo e deve essere il layer applicativo a gestire il problema della ricostruzione temporale dei dati.

Ultima modifica effettuata da gantonio il 06/12/2007 alle 19:08
PM Quote
Avatar
gmxsm (Normal User)
Newbie


Messaggi: 20
Iscritto: 06/12/2007

Segnala al moderatore
Postato alle 21:04
Giovedì, 06/12/2007
Testo quotato

Postato originariamente da gantonio:

Testo quotato

Postato originariamente da gmxsm:Cmq ho notato inoltre che provando ad inviare le dimensioni di una stringa, questa non corrisponde con la variabile bytesTotal del data_arrival nel winsock..
Giusto per sapere se sbaglio: il valore ritornato dalla funzione Len(stringa) non dovrebbe essere  uguale al valore di bytesTotal?[/QUOTE]

Non ho capito ... qual e' il problema?

[Quote]Nel frattempo di una risposta cerco ancora in giro ma penso che il problema stia nel fatto che qualcosa mi sfugge...



Ma perche'? Ti ho risposto ... forse non sono stato chiaro ...



No scusa è che tra studio e pc non avevo capito bene ciò che intendessi con:
Testo quotato


Devi quindi "pensare" al tuo programma in modo diverso considerando che invii una testata con il numero dei byte trasmessi, fai in modo che questi siano TUTTI ricevuti prima di considerare che il prossimo blocco abbia una sua testata.


Avevo pensato dovessi confrontare i bytesTotal con quelli scritti nella stringa, e non mi trovavo con le quantità...


Grazie per i suggerimenti, avevo intuito una strada del genere, ma non avrei fatto molto senza  di te...:k:
Cmq ora ci lavoro su, magari dopo martedì che ho esami:d, e in caso non riuscissi...beh vedrai un nuovo post :D

p4p3r0g4 non ho ben capito che metodo usi:
Testo quotato


Io uso ragionare diversamente.
piuttosto che segmentare gli invii occupo totalmente l'invio (anche con l'utilizzo di spazi vuoti e caratteri nulli)
oppure (se posso) gli passo un "doevents" che mi invia il pacchetto in maniera corretta.
Certo che è un po più lento ma di solito i file (che sono gli invii "massicci") occupano totalmente + invii e gli altri non hanno bisogno di "immediatezze" della differenza di 1/100 di secondo.


ma non penso sia proprio "corretto"..Soprattutto se si tratta di file grossi..

PM Quote
Avatar
P4p3r0g4 (Member)
Guru


Messaggi: 1319
Iscritto: 29/12/2006

Segnala al moderatore
Postato alle 0:23
Venerdì, 07/12/2007
Testo quotato

Postato originariamente da gantonio:

Testo quotato

Postato originariamente da P4p3r0g4:

Io uso ragionare diversamente.
piuttosto che segmentare gli invii occupo totalmente l'invio (anche con l'utilizzo di spazi vuoti e caratteri nulli)
oppure (se posso) gli passo un "doevents" che mi invia il pacchetto in maniera corretta.



Scusa ... ma come non "segmenti" un file AVI da 800 M ?

E a cosa serve un DoEvents eseguito su un client quando chi riceve, il server, ottiene i dati in piu' parti "indipendentemente" da come sono stati spediti dal client (per le note caratteristiche del protocollo TCP)?

Testo quotato


Certo che è un po più lento ma di solito i file (che sono gli invii "massicci") occupano totalmente + invii e gli altri non hanno bisogno di "immediatezze" della differenza di 1/100 di secondo.



Non ho capito nulla ...

Il fatto e' che tu, dal processo che spedisce dati con TCP, NON HAI alcun controllo sullo "spettezzamento" dei dati in arrivo e deve essere il layer applicativo a gestire il problema della ricostruzione temporale dei dati.



sbagli di fondo.
col mio metodo non ho affatto bisogno di un "Layer Applicativo"

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 0:59
Venerdì, 07/12/2007
Sara' che sbaglio ... ma il tuo metodo ancora non si e' capito perche' non hai spiegato come trasmetti il file da 800 M ...

Ultima modifica effettuata da gantonio il 07/12/2007 alle 1:00
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo