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
C# / VB.NET - Inviare e convertire Byte di un'immagine tramite Winsock (VB.NET)
Forum - C# / VB.NET - Inviare e convertire Byte di un'immagine tramite Winsock (VB.NET)

Avatar
Milmor94 (Normal User)
Rookie


Messaggi: 43
Iscritto: 10/07/2011

Segnala al moderatore
Postato alle 21:48
Lunedì, 11/07/2011
Salve a tutti... Vorrei sapere come si invia un'immagine (sotto forma di byte) da un programma client a un server tramite Winsock.

In pratica il server invia una richiesta al client in una rete lan. Questo a sua volta cattura un'istantanea dello schermo, la converte in byte e ritorna i dati al server.
Ecco qui i problemi:
1) I byte effettivamente rimandati al server risultano notevolmente meno
2) (di conseguenza) il programma non riesce a visualizzare l'immagine

CLIENT: invio dell'istantanea schermo
Dim Bytes() As Byte = IO.File.ReadAllBytes(PercorsoIstantaneaSchermo)
AxWinsock1.SendData(Bytes)

SERVER: ricezione e conversione delle informazioni
Private Sub AxWinsock1_DataArrival
        Dim Bytes(CInt(ms.Length - 1)) As Byte

        AxWinsock1.GetData(Bytes, 0, e.bytesTotal)

        IO.File.WriteAllBytes(Percorso di salvataggio, Bytes)
        PictureBox1.Image = Bitmap.FromStream(New IO.MemoryStream(Bytes), True, False)
End Sub

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
2
Down
V
Segnala al moderatore
Postato alle 10:31
Martedì, 12/07/2011
Per l'ennesima volta, .NET <-> Socket. Non dovresti usare AxWinsock.

Comunque sembra più difficile di quanto in realtà non sia. E' sufficiente inviare un header iniziale che contenga la lunghezza del file, letto il quale saprai esattamente quanti byte riunire.

Quindi occorre un codice di questo tipo - Milmor94 - 12/07/11 14:50
AxWinsock1.GetData(Bytes, 0, e.bytesTotal) AxWinsock1.GetData(Bytes2, 0, e.bytesTotal) - Milmor94 - 12/07/11 14:51
No, non puoi sapere a priori quante volte dovrai leggere. Come ti ho detto devi inviare un qualche dato sulla lunghezza del file inviato, ad esempio nei primi 4 byte. - Il Totem - 13/07/11 10:57
Ma però è anche possibile creare un ciclo che continua a richiamare AxWinsock1.GetData(Bytes, 0, e.bytesTotal) fino a quando il valore "Bytes" restituito è nullo? - Milmor94 - 13/07/11 11:11
Non è detto che quando il file è inviato tu non riceva più niente. Ad esempio potrebbe inviare un altro file, o altri dati. Non è nemmeno detto che la fine del file e l'inizio del successivo arrivino in due DetData diverse. Sai solo che arrivano in sequenza come sono stati inviati. - Il Totem - 13/07/11 11:14
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6384
Iscritto: 03/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 22:13
Lunedì, 11/07/2011
I dati ricevuti dalla rete nella DataArrival, non arrivano necessariamente tutti in una sola volta, anzi ...

L'evento può essere richiamato più volte ad indicare che i dati arrivano in varie parti, anche se nell'ordine corretto.

Deve essere il tuo programma a ricostruire i dati.

Inoltre, non ha senso usare il controllo Winsock con .NET ...

Quindi i Byte acquisiti devono essere "tagliati" in più parti, inviati al server e "riuniti"... Comincia a complicarsi tutto... Può essere più facile con i Socket? - Milmor94 - 11/07/11 22:17
No, solo in ricezione devono essere riuniti. Che vuol dire "con i socket" ,,, è uguale ... - nessuno - 11/07/11 22:25
...Ma una volta che in ricezione richiami la proprietà .GETDATA come è possibile ottenere più pacchetti di byte?? In teoria se ne ottiene uno e basta... - Milmor94 - 11/07/11 22:51
L'evento DataArrival viene attivato più volte e quindi viene chiamato più volte il metodo (non proprietà) GetData. Si tratta di accumulare tutti i pacchetti che arrivano fino alla lunghezza originale del file (che devi conoscere) - nessuno - 12/07/11 10:10


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM