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 - problema spedizione file con winsock in vb6
Forum - Visual Basic 6 - problema spedizione file con winsock in vb6

Avatar
alan1 (Normal User)
Newbie


Messaggi: 20
Iscritto: 13/07/2006

Segnala al moderatore
Postato alle 0:53
Giovedì, 13/07/2006
Buonasera a tutti e complimenti per il forum
davvero interessante.

Porgo il mio problema :
allora io devo realizzare una applicazione client server, dove il client invia nome utente e password al server per l' identificazione poi il client gli manda un codice che il server appena lo riceve gli mostra la lista dei file che contiene, a questo punto io seleziono il file di mio interesse e il server me lo deve inviare al client.

ora la prima parte lo realizzata con il controllo winsock di vb6, sfuttando la tecnica di una chat, cioe il client ed il server dialogano.
ora nel momento in cui il client passa il codice segreto al server , ho fatto in modo che il server metta tutto il contenuto della sua directory in una stringa e inviata al client e cosi via.
ora nel momento in cui seleziono il file di mio interesse e lo comunico al server sempre mediante la tecnica della chat, il server identifica il file e lo dovrebbe inviare. (insomma è come se avrei creato un protocollo di comunicazione tutto mio). Se si poteva fare meglio spiegatemelo perche non sono molto esperto sulla cosa e premetto che il controllo winsock lo sto ancora studiando.
A questo punto creo un nuovo controllo winsock che lo dedico solo per inviare il file.
solo che quest'ultimo passaggio non mi va , mi potreste dare una mano?
eccovi la parte di codice che ho scritto io naturalmente relativa solo alla parte di invio del file.

http://loganino.linby.net/paste.php?state=1&Id=1217

pero non so dove sbaglio.
aiutatemi se possibile

vi ringrazio anticipatamente e aspetto vostre notizie con ansia
ciao a tutti e grazie ancora !!!

Ultima modifica effettuata da alan1 il 13/07/2006 alle 0:57
PM Quote
Avatar
Morpheus80 (Ex-Member)
Rookie


Messaggi: 24
Iscritto: 11/07/2006

Segnala al moderatore
Postato alle 2:24
Giovedì, 13/07/2006
Ciao ;)
nel codice prima di tutto prova a inserire delle variabili di riconoscimento winsock, prova con questo:

Codice sorgente - presumibilmente VB.NET

  1. Private Declare Function getsockopt Lib "wsock32.dll" (ByVal t As Long, ByVal Liv As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long
  2. Private Const SO_SNDBUF = &H1001
  3. Private Const SOL_SOCKET = &HFFFF&
  4. Private FILEHANDLE As Integer
  5. Private DIMPACKET As Long


Questa dichiarazione ti servirà più avanti per inviare/ricevere pacchetti in comunicazione con il server.

Per la connessione con il server potresti usare questo, Inserendo un pulsante "Command1" e impostando l'evento click in modo che il client si connetta al server utilizzando una porta (specificata) attraverso un IP (specificato da un TextBox):

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Command1_Click()
  2. If Socket.State <> sckClosed Then Socket.Close
  3.     Socket.LocalPort = 0
  4.     Socket.Connect IndirizzoIP.Text, Text1.Text
  5. End Sub



Poi per inviare i file al server puoi inserire questo, in modo che tu possa scegliere quale file inviare al server tramite un CommonDialog preimpostato:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Command2_Click()
  2.     Dim POS As Integer
  3.     CommonDialog1.ShowOpen
  4.     File.Text = CommonDialog1.FileName
  5.          
  6.    
  7.     If Socket.State <> sckConnected Then Exit Sub
  8.     If Dir(File.Text) = "" Then
  9.         MsgBox "Il file non esiste!", vbCritical + vbOKOnly
  10.        
  11.     Else
  12.         POS = 0
  13.         While InStr(POS + 1, File.Text, "\") > 0
  14.             POS = InStr(POS + 1, File.Text, "\")
  15.         Wend
  16.         If CommonDialog1.FileName = "" Then Exit Sub
  17.         Socket.SendData "/FILE " & Mid(File.Text, POS + 1) & " " & FileLen(File.Text)
  18.  
  19.     End If
  20.    
  21. End Sub



mi sembra più facile da compilare in questa maniera...

Ultima modifica effettuata da Morpheus80 il 13/07/2006 alle 2:59
PM Quote
Avatar
alan1 (Normal User)
Newbie


Messaggi: 20
Iscritto: 13/07/2006

Segnala al moderatore
Postato alle 16:22
Giovedì, 13/07/2006
ti ringrazio per avermi risposto.
allora il server deve inviare il file al client.
quindi io al momento che clicco il tasto importa sul client, gia il server sa il file che mi deve inviare e che esistera sicuramente al 100%.
quindi mi conviene scrivere solo la riga :

socket.senddata "/file" numefile len(nomefile) ?

e poi come faccio a ricevere?

ti ringrazio anticipatamente
ciao!!!

PM Quote
Avatar
Morpheus80 (Ex-Member)
Rookie


Messaggi: 24
Iscritto: 11/07/2006

Segnala al moderatore
Postato alle 19:57
Giovedì, 13/07/2006
Allora:
Fino qui mi sembra giusto, però prova a modificare il Sub di invio (prima devi aggiungere un TextBox e chiamarlo txtOut e chiamare il pulsante di invio dati come InviaFile) con:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub InviaFile_Click()
  2.     Dim data As String
  3.     data = txtOut
  4.     wskClient.SendData data & vbCrLf
  5. End Sub


(però andrebbe bene anche come l'hai scritto tu) così la connessione dovrebbere essere a posto a livello dell'invio dei dati.
poi invece per ricevere la risposta del server dovrai usare questo codice che serve per ricevere le stringhe inviate da esso:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub wskClient_DataArrival(ByVal bytesTotal As Long)
  2.     wskClient.GetData a
  3.     txtReply = a & VbCrLf
  4. End Sub


questo codice potrebbe servire anche per ricevere la risposta del server appena ti sei connesso.

Ultima modifica effettuata da Morpheus80 il 13/07/2006 alle 19:59
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:50
Giovedì, 13/07/2006
Ho fatto la stessa cosa nel progetto Beatrix, solo che l'ho implementato in C++ e Delphi. Ho fatto il tutto nella maniera più primitiva (raw), il codice vb6 non te lo saprei dire perchè non ho usato molto il winsock su vb6, ma posso spiegarti la procedura:

- Il client comunica al server il file da ricevere
- Il server risponde al client il numero di bytes che occupa il file (e quindi si è in grado di sapere quanti bytes il client deve aspettarsi di ricevere)
- Il server invia pacchetti di 4096 bytes fintanto che i bytes del file da inviare sono superiori a 4096, quando diventano di meno invia l'ultimo pacchetto con i bytes rimanenti.
- Il client riceve i pacchetti di 4096 bytes finchè non arriva all'ultimo (ad ogni pacchetto incrementa un contatore dei bytes e facendo una rapida sottrazione "bytestotali - bytestrasferiti = bytesrimanenti", "se bytesrimanenti < 4096 allora è l'ultimo pacchetto") e riceve quest'ultimo pacchetto con gli ultimi bytes.
- Man mano che riceve i bytes, il client li scrive su un file locale.

Il tutto da gestire in binario, attenzione che il winsock in vb6 potrebbe gestire i dati come string oppure variant.

Ultima modifica effettuata da pierotofy il 13/07/2006 alle 23:51


Il mio blog: https://piero.dev
PM Quote