Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di x69asterix
    Registrato dal
    Jan 2005
    Messaggi
    1,303

    [VB6] Winsock: Invio immagine

    speriamo di non essere ripreso dall' Admin..

    ho provato a fare qualche giretto in rete ma non ho trovato nulla di interessante, praticamente invio un' immagine dal client e dovrei vederla in un controllo image lato server, ho trovato questo codice, ma non ho avuto modo di provarlo se realmente è corretto, visto che non sò come riprenderlo lato server


    codice:
    Private Sub Command2_Click()
        Dim sFileName As String
        Dim lOffset As Long
        Dim bTemp As Byte
        Dim bFileData() As Byte
        Dim lLength As Long
        
        
        sFileName = "f:\mia.bmp"
        
        Open sFileName For Binary Access Read As #1
        ReDim bFileData(FileLen(sFileName))
        lLength = FileLen(sFileName) + 1
        
        For lOffset = 1 To lLength
            If Not lOffset = lLength Then
                Get #1, lOffset, bTemp
                bFileData(lOffset - 1) = bTemp
            Else
                bFileData(lOffset - 1) = CByte(26)
            End If
        Next lOffset
        
        Close #1
        
        Winsock1.SendData bFileData()
        
    End Sub
    qualche suggerimento...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [VB6] Winsock: Invio immagine

    Originariamente inviato da x69asterix
    speriamo di non essere ripreso dall' Admin..
    Perche'? Cosa hai fatto? Hai il "carbone bagnato"?

    qualche suggerimento...
    Il codice mi sembra sbagliato perche' invia un carattere 26 (EOF) alla fine del file.
    Essendo un file binario, non ha senso farlo.

    E mi sembra molto inefficiente perche' legge il file dal disco "byte per byte" invece di effettuare una singola lettura.

    Detto questo, inviato il file, dall'altra parte basta il solito socket che ascolta sulla porta su cui si connette il client e riscrive i dati inviati ...

    E mi sembra che tu dovresti avere esperienza con winsock dato che non e' la prima volta che affronti questi problemi ...

  3. #3
    Utente di HTML.it L'avatar di x69asterix
    Registrato dal
    Jan 2005
    Messaggi
    1,303
    allora dalle mie prove senza risultato qualcosa si muove ma credo di essere ancora lontano:
    praticamente si mi crea un file .bmp da 8kb ma l' immagine oltre ad essere non valida è anche inferiore al peso reale di circa 1 mega, dove sbaglio?

    codice:
    Private Sub Command2_Click()
    Dim immagine() As Byte
    Open "C:\prova.bmp" For Binary As #1
    ReDim immagine(0 To LOF(1) - 1)
    Get #1, , immagine
    Close #1
    Winsock1.SendData immagine


    codice:
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim immagine() As Byte
    Winsock1.GetData immagine
    Open App.Path & "\imm.bmp" For Binary Access Write As #1
    Put #1, , immagine()
    Close #1
    DoEvents
    Image1.Picture = LoadPicture(App.Path & "\imm.bmp")
    Kill (App.Path & "\imm.bmp")
    End Sub

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Nel Data_Arrival i dati non arrivano tutti insieme ma a blocchi, in un numero variabile ... devi tenerne conto ...

  5. #5
    Utente di HTML.it L'avatar di x69asterix
    Registrato dal
    Jan 2005
    Messaggi
    1,303
    quindi comunque nel senddata il codice è corretto?

    codice:
    Private Sub Command2_Click()
    Dim immagine() As Byte
    Open "C:\prova.bmp" For Binary As #1
    ReDim immagine(0 To LOF(1) - 1)
    Get #1, , immagine
    Close #1
    Winsock1.SendData immagine()

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sì ... il problema e' nella ricezione ...

    Il fatto che venga inviato tutto il file con un solo senddata non significa che venga ricevuto tutto in un solo blocco ...

  7. #7
    Utente di HTML.it L'avatar di x69asterix
    Registrato dal
    Jan 2005
    Messaggi
    1,303
    allora diciamo che ci sono riuscito, ma mi resta di capire come chiudere il file:

    codice:
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
       If Winsock1.State <> sckClosed Then Winsock1.Close
       Winsock1.Accept requestID
       Open App.Path & "\imm.bmp" For Binary Access Write As #1
    End Sub

    codice:
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim immagine() As Byte
    Winsock1.GetData immagine
    
    Put #1, , immagine()
    
    End Sub

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ti sei chiesto qual e' la condizione che ti può indicare di chiudere il file?

    1) Il client si disconnette, il server lo rileva e chiude il file, rimettendosi in ascolto

    oppure, se non vuoi che la connessione cada

    2) Il client aveva comunicato all'inizio della trasmissione, la lunghezza in byte del file da trasmettere e il server confronta tale informazione con la lunghezza corrente del file; appena raggiunta, chiude il file ma non la connessione ...

  9. #9
    Utente di HTML.it L'avatar di x69asterix
    Registrato dal
    Jan 2005
    Messaggi
    1,303
    allora finalmente ci sono, non sò se è il metodo più corretto, comunque funziona, quello che mi interessa sapere, è se è normale l' uso di due winsock per interfaccia, posto il codice parziale funzionante lato client e server, magari a qualcuno potrebbe interessare, se poi ci sono delle migliorie attendo notizie:


    codice:
    Option Explicit
    
    
    Private Sub Command1_Click()
    If Winsock1.State <> sckClosed Then Winsock1.Close
    If Winsock2.State <> sckClosed Then Winsock2.Close
    Winsock1.Connect "indirizzo", 4001
    Winsock2.Connect "indirizzo", 4002
    End Sub
    
    Private Sub Command2_Click()
    Winsock2.SendData "apri"
    
    
    Dim immagine() As Byte
    Open "C:\prova.bmp" For Binary As #1
    ReDim immagine(0 To LOF(1) - 1)
    DoEvents
    Get #1, , immagine
    Winsock1.SendData immagine()
    Close #1
    
    End Sub
    
    Private Sub Winsock1_SendComplete()
    Winsock2.SendData "fine"
    End Sub
    
    
    *********************************************
    
    Option Explicit
    
    Private Sub Form_Load()
    Winsock1.LocalPort = 4001
    Winsock1.Listen
    Winsock2.LocalPort = 4002
    Winsock2.Listen
    End Sub
    
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
       If Winsock1.State <> sckClosed Then Winsock1.Close
       Winsock1.Accept requestID
        
    End Sub
    
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim immagine() As Byte
    Winsock1.GetData immagine
    Put #1, , immagine()
    DoEvents
    End Sub
    
    Private Sub Winsock2_ConnectionRequest(ByVal requestID As Long)
       If Winsock2.State <> sckClosed Then Winsock2.Close
          Winsock2.Accept requestID
       
    End Sub
    
    Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
    Dim dati As String
    
    Winsock2.GetData dati, vbString
    If Left(dati, 4) = "apri" Then
      Open App.Path & "\imm.bmp" For Binary Access Write As #1
      DoEvents
      Text1.Text = dati
      Else
      If Left(dati, 4) = "fine" Then
      Text1.Text = dati
      DoEvents
      Close #1
      DoEvents
      Picture1.Picture = LoadPicture(App.Path & "\imm.bmp")
      DoEvents
      Kill (App.Path & "\imm.bmp")
      End If
      End If
    End Sub

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai usato un "canale" per i comandi e un "canale" per i dati, usando due socket.

    Ovviamente funziona, ma questo fatto non e' necessario. Puoi usare un solo socket (ovviamente) per far passare sia i comandi (apri, fine) che i dati binari dell'immagine.

    Se avessi seguito il mio suggerimento, ci saresti riuscito ... ti avevo scritto


    "Il client aveva comunicato all'inizio della trasmissione, la lunghezza in byte del file da trasmettere e il server confronta tale informazione con la lunghezza corrente del file; appena raggiunta, chiude il file ma non la connessione ..."
    e questo con l'unico socket aperto ...

    In pratica, se non mi fossi spiegato bene, prima di inviare il file, avresti dovuto inviare qualcosa come

    APRI0000074554

    in cui indichi di aprire il file e che questo avra' una lunghezza di 74554 byte.

    In seguito, tutti i dati che arrivano, li inserisci nel file, tenendo presente quanti ne ricevi e chiudi appena sono arrivati tutti i 74554 byte ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.