Oppure

Loading
12/07/06 22:53
alan1
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.

loganino.linby.net/…

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 12/07/06 22:57
aaa
13/07/06 0:24
Morpheus80
Ciao ;)
nel codice prima di tutto prova a inserire delle variabili di riconoscimento winsock, prova con questo:

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
Private Const SO_SNDBUF = &H1001
Private Const SOL_SOCKET = &HFFFF&
Private FILEHANDLE As Integer
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):

Private Sub Command1_Click()
If Socket.State <> sckClosed Then Socket.Close
    Socket.LocalPort = 0
    Socket.Connect IndirizzoIP.Text, Text1.Text
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:

Private Sub Command2_Click()
    Dim POS As Integer
    CommonDialog1.ShowOpen
    File.Text = CommonDialog1.FileName
         
   
    If Socket.State <> sckConnected Then Exit Sub
    If Dir(File.Text) = "" Then
        MsgBox "Il file non esiste!", vbCritical + vbOKOnly
        
    Else
        POS = 0
        While InStr(POS + 1, File.Text, "\") > 0
            POS = InStr(POS + 1, File.Text, "\")
        Wend
        If CommonDialog1.FileName = "" Then Exit Sub
        Socket.SendData "/FILE " & Mid(File.Text, POS + 1) & " " & FileLen(File.Text)

    End If
    
End Sub


mi sembra più facile da compilare in questa maniera...
Ultima modifica effettuata da Morpheus80 13/07/06 0:59
aaa
13/07/06 14:22
alan1
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!!!
aaa
13/07/06 17:57
Morpheus80
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:
Private Sub InviaFile_Click() 
    Dim data As String 
    data = txtOut 
    wskClient.SendData data & vbCrLf 
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:
Private Sub wskClient_DataArrival(ByVal bytesTotal As Long) 
    wskClient.GetData a 
    txtReply = a & VbCrLf 
End Sub 

questo codice potrebbe servire anche per ricevere la risposta del server appena ti sei connesso.
Ultima modifica effettuata da Morpheus80 13/07/06 17:59
aaa
13/07/06 21:50
pierotofy
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 13/07/06 21:51
Il mio blog: piero.dev