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 - Winsock, questo mistero
Forum - Visual Basic 6 - Winsock, questo mistero

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
acromangelo (Ex-Member)
Rookie


Messaggi: 25
Iscritto: 19/06/2008

Segnala al moderatore
Postato alle 21:22
Mercoledì, 06/05/2009
Mi ripresento a voi con un nuovo problema che mi ha fatto disperare per 3 giorni consecutivi:
ho un client e un server connessi tra di loro. uno deve inviare all'altro un'immagine e usa questo tipo di invio

Codice sorgente - presumibilmente VB.NET

  1. Dim NextPart as Boolean
  2.  
  3. Private Function InviaImmagine()
  4. Dim FileLength As Long, Temp As String, PackageSize As Long, LastData As Boolean
  5. FileLength = FileLen(App.path & "\immagine.jpg")
  6. NextPart = False
  7. Main.wsk.SendData "FILE||0"
  8. PackageSize = 2048
  9. LastData = False
  10. FF = FreeFile
  11. Open App.path & "\immagine.jpg" For Binary Access Read As #FF
  12. Temp = ""
  13. Do Until EOF(FF)
  14.     If FileLength - Loc(FF) <= PackageSize Then
  15.         PackageSize = FileLength - Loc(FF) + 1
  16.         LastData = True
  17.     End If
  18.     Temp = Space$(PackageSize)
  19.     Get FF, , Temp
  20.     Do While NextPart = False
  21.         DoEvents
  22.     Loop
  23.     NextPart = False
  24.     If LastData = True Then
  25.         Temp = Mid(Temp, 1, Len(Temp) - 1)
  26.     End If
  27.     Main.wsk.SendData "FILE||1||" & Temp
  28. Loop
  29. Do While NextPart = False
  30.     DoEvents
  31. Loop
  32. NextPart = False
  33. Close FF
  34. Kill App.path & "\immagine.jpg"
  35. Main.wsk.SendData "FILE||2"
  36. End Function
  37.  
  38. Private Sub wsk_SendComplete()
  39. NextPart = True
  40. End Sub



e questo tipo di ricezione

Codice sorgente - presumibilmente VB.NET

  1. Private Sub wsk_DataArrival(ByVal bytesTotal As Long)
  2. Dim Incoming as string, Parsed() as string, FF as integer
  3. wsk.GetData Incoming
  4. animazione = True
  5. Parsed = Split(Incoming, "||")
  6. If Parsed(0) = "FILE" Then
  7. If Parsed(1) = "0" Then
  8.     FF = FreeFile
  9.     Open App.Path & "\immagine.jpg" For Binary Access Write As #FF
  10.     FileBar.Max = Parsed(2)
  11.     FileBar.Min = 0
  12.     FileBar.Value = 0
  13. ElseIf Parsed(1) = "1" Then
  14.     Put #FF, , Parsed(2)
  15.     If Not (FileBar.Value + bytesTotal) > FileBar.Max Then FileBar.Value = FileBar.Value + bytesTotal
  16. ElseIf Parsed(1) = "2" Then
  17.     Close #FF
  18.     picImmagine.Picture = LoadPicture(App.Path & "\immagine.jpg")
  19.     Kill App.Path & "\immagine.jpg"
  20.     FileBar.Value = 0
  21. End If
  22. End If
  23. End Sub



Ecco, il codice funziona alla perfezione, ma l'immagine arriva tutta a casaccio, come se i pezzi di immagine arrivassero a caso, e la cosa strana è che non avviene sempre...poche volte invece l'immagine arriva perfettamente. Potreste aiutarmi cercando di capire il motivo di questi errori?
PS: questo tipo di metodo per inviare un file l'ho già usato in un programma di scambio files e li funziona perfettamente sempre.

Grazie in anticipo

Ultima modifica effettuata da acromangelo il 06/05/2009 alle 21:26
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:44
Mercoledì, 06/05/2009
Il programma si basa sul riconoscimento dei due caratteri

||

per indicare l'inizio dello stesso ...

Ma questi due caratteri si possono presentare all'interno di un file binario lungo e complesso come un'immagine.

A seconda dei casi quindi (se nell'immagine quella coppia di byte appare piu' volte) il programma che riceve potrebbe essere "ingannato" e i dati non interpretati correttamente.

Prova a cambiare quella sequenza e renderla piu' complessa ...

PM Quote
Avatar
acromangelo (Ex-Member)
Rookie


Messaggi: 25
Iscritto: 19/06/2008

Segnala al moderatore
Postato alle 22:16
Mercoledì, 06/05/2009
Appena ho letto la tua risposta ho pensato che quasi sicuramente sarebbe stato quello...ma poi provandolo ho verificato che anche cambiando "||" con "|ødividø|" non cambiava nulla...

l'errore rimane =(

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 8:56
Giovedì, 07/05/2009
Allora posta il progetto zippato e un file (un jpg) che ti da' il problema.

Provero' il tuo programma proprio con quel file per capire dove sta l'errore ...

(al limite posta il link di un sito da cui scaricare quello che ti ho detto).

PM Quote
Avatar
acromangelo (Ex-Member)
Rookie


Messaggi: 25
Iscritto: 19/06/2008

Segnala al moderatore
Postato alle 16:15
Giovedì, 07/05/2009
Eccolo quà...non so più che fare :(


acromangelo ha allegato un file: programma.zip (244885 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da acromangelo il 07/05/2009 alle 16:17
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 22:47
Giovedì, 07/05/2009
Ho visto meglio il codice e ho trovato il problema ...

Quel codice da' per scontato il fatto che i pacchetti che vengono inviati, siano ricevuti cosi' come sono inviati all'interno di un evento DataArrival.

Per le comunicazioni TCP, non e' cosi'. E non e' una cosa da poco. E' il motivo per cui hai (a volte) quel comportamento.

Per capirci, l'evento DataArrival puo' essere richiamato dopo che ha ricevuto un certo numero di byte DIVERSO da quello che ti aspetti. E dato che in quell'evento tu tratti solamente quelli che ti aspetti, quelli in piu' vengono persi e l'immagine non e' quella di partenza.



PM Quote
Avatar
acromangelo (Ex-Member)
Rookie


Messaggi: 25
Iscritto: 19/06/2008

Segnala al moderatore
Postato alle 18:08
Venerdì, 08/05/2009
mmm ho capito...e allora mi spiegheresti perchè questo altro programma che ho fatto funziona alla perfezione anche se ha lo stesso tipo di invio?


acromangelo ha allegato un file: Scambio dei files.zip (122789 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 9:20
Sabato, 09/05/2009
Testo quotato

Postato originariamente da acromangelo:

mmm ho capito...e allora mi spiegheresti perchè questo altro programma che ho fatto funziona alla perfezione anche se ha lo stesso tipo di invio?



Non e' vero.

Anche questo programma presenta gli stessi problemi.

Ho provato a trasferire un file da poco piu' di 15 M e il file trasferito era diverso sia nella sequenza di byte sia (addirittura) nella grandezza ...

Il trasferimento Winsock non e' un mistero. Se devi scrivere un programma "affidabile" basta tenere conto delle regole del TCP ...

La regola fondamentale e' tenere SEMPRE presente il fatto che nell'evento DataArrival possono essere letti piu' (o anche meno) dati di quello che ti aspetti. Quando leggi la stringa di dati in arrivo nell'evento, devi trattarla TUTTA, dall'inizio alla fine.

PM Quote
Avatar
acromangelo (Ex-Member)
Rookie


Messaggi: 25
Iscritto: 19/06/2008

Segnala al moderatore
Postato alle 17:03
Lunedì, 11/05/2009
uffi...sto maledetto winsock! Non potresti farmi il favorone di dirmi il modo giusto per inviarmi i file col winsock, magari mostrandomi un sorgente? saresti molto gentile dato che è da 2 anni che programmo in vb e ancora non sono riuscito a trovare una soluzione...

grazie mille!

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo