'''''''''''''''''''CODICE CLIENT'''''''''''''''
Private Sub Connetti_Click() ' il tasto di connessione al server
Select Case Connetti.Caption
Case "Connetti"
If Socket.State <> sckClosed Then Socket.Close
Socket.LocalPort = 0
Socket.Connect IndirizzoIP.Text, Port.Text
w.LocalPort = 0
w.Connect IndirizzoIP.Text, Port.Text + 1
Connetti.Caption = "Disconnetti"
Case "Disconnetti"
Socket.Close
w.Close
Connetti.Caption = "Connetti"
End Select ' il socket w non centra niente con l'invio del file, serve per altre cose di abbellimento.
End Sub
Private Sub Invia_Click() ' questo invia la richiesta al server del file da mandare, includendo tutte le informazioni del file (/file nome dimensione)
Dim POSIZIONE As Integer
If Socket.State <> sckConnected Then Exit Sub
If Dir(NomeFile.Text) = "" Then
MsgBox "Il file non esiste!", vbCritical + vbOKOnly
Else
POSIZIONE = 0
While InStr(POSIZIONE + 1, NomeFile.Text, "\") > 0
POSIZIONE = InStr(POSIZIONE + 1, NomeFile.Text, "\")
Wend
Socket.SendData "/FILE " & Mid(NomeFile.Text, POSIZIONE + 1) & " " & FileLen(NomeFile.Text)
End If
End Sub
Private Sub SocketInvio_Connect() 'il server accetta il file e manda le informazioni della nuova connessione per inviare il file, e quando il client riceve le info si connette e apre il file in binario
Dim DATI(511) As Byte
FILEHANDLE = FreeFile
Open NomeFile.Text For Binary As FILEHANDLE
Get FILEHANDLE, , DATI
SocketInvio.SendData DATI
Call getsockopt(SocketInvio.SocketHandle, SOL_SOCKET, SO_SNDBUF, DIMENSIONEPACCHETTO, Len(DIMENSIONEPACCHETTO))
If DIMENSIONEPACCHETTO = 0 Then DIMENSIONEPACCHETTO = Text1.Text
End Sub
Private Sub Socket_DataArrival(ByVal bytesTotal As Long) ' il file ovviamente viene diviso in pacchetti e quando il server ne riceve uno invia la richiesta del successivo. Finiti i pacchetti il socket si disconnette.
Dim DATI() As Byte
Dim comando As String
Call Socket.GetData(DATI)
Socket.GetData comando
DATI = StrConv(DATI, vbUnicode)
If Left(DATI, 11) = " +OK: PORTA" Then
If SocketInvio.State <> sckClosed Then SocketInvio.Close
SocketInvio.LocalPort = 0
SocketInvio.Connect Socket.RemoteHostIP, Mid(DATI, 12)
End If
If (Left(DATI, 10) = " +OK: RECV") Then
If FILEHANDLE <> 0 Then
DATI = Space(DIMENSIONEPACCHETTO / 2)
Get FILEHANDLE, , DATI
SocketInvio.SendData DATI
End If
End If
If (Left(DATI, 10) = " +OK: FINE") Then
Close FILEHANDLE
SocketInvio.Close
MsgBox "Trasferimento completato!", vbInformation + vbOKOnly
End If
End Sub
''''''''''''''CODICE SERVER''''''''''''''''''
Private Sub Socket_DataArrival(ByVal bytesTotal As Long) ' il server intanto se ne sta li buonino buonino a salvare i pacchetti ricevuti nel nuovo file aperto sempre in binario
Dim DATI() As Byte
Dim NOMEFILE As String
Dim DIMENSIONE As Long
Dim POSIZIONE As Integer
Dim TEMPSTR As String
Call Socket.GetData(DATI)
DATI = StrConv(DATI, vbUnicode)
Select Case Left(UCase(DATI), 5)
Case "/FILE"
' I files sono mandati nella forma:
' /FILE NOME DIMENSIONE
' possono contenere anche spazi:
' /FILE NOME DEL FILE DIMENSIONE
TEMPSTR = Mid(DATI, 7)
POSIZIONE = 0
While InStr(POSIZIONE + 1, TEMPSTR, " ") > 0
POSIZIONE = InStr(POSIZIONE + 1, TEMPSTR, " ")
Wend
' POSIZIONE conterrà il punto dove inizia la dimensione
NOMEFILE = Left(TEMPSTR, POSIZIONE - 1)
DIMENSIONE = CLng(Mid(TEMPSTR, POSIZIONE + 1))
TEMPSTR = "È in arrivo un file di nome " & NOMEFILE & " di " & CStr(DIMENSIONE) & " bytes."
TEMPSTR = TEMPSTR & vbNewLine
TEMPSTR = TEMPSTR & "Desideri accettarlo?"
If MsgBox(TEMPSTR, vbYesNo + vbQuestion) = vbYes Then
FILEDASALVARE = App.Path & "\RICEVUTI\" & NOMEFILE
If Dir(FILEDASALVARE) <> "" Then
TEMPSTR = "Il file " & NOMEFILE & " esiste già." & vbNewLine
TEMPSTR = TEMPSTR & "Desideri sovrascriverlo?"
If MsgBox(TEMPSTR, vbYesNo + vbQuestion) = vbYes Then
Kill FILEDASALVARE
Else
' Chiedi di cambiare il nome o fare altro...
' Noi lo rifiuteremo...
Socket.SendData " -ERR: NONACCETTATO" & vbNewLine
Stati.AddItem "File " & NOMEFILE & " rifiutato."
Exit Sub
End If
End If
DIMENSIONEFILE = DIMENSIONE
If Passivo.State <> sckClosed Then Passivo.Close
Passivo.LocalPort = 0
Passivo.Listen
Socket.SendData " +OK: PORTA " & Passivo.LocalPort & vbNewLine
Stati.AddItem "Accettazione del file " & NOMEFILE
Stati.AddItem "Ascolto sulla porta " & Passivo.LocalPort
StatoLabel.Caption = "Ricezione del file " & NOMEFILE & " di " & DIMENSIONE & " bytes."
Avanzamento.Caption = "0 bytes ricevuti su " & DIMENSIONE
AvanzamentoProgress.Value = 0
AvanzamentoProgress.Max = 0
Else
Socket.SendData " -ERR: NONACCETTATO" & vbNewLine
Stati.AddItem "File " & NOMEFILE & " rifiutato."
End If
Case "/FINE"
Passivo.Close
Close FILEHANDLE
FILEDASALVARE = ""
FILEHANDLE = 0
Stati.AddItem "Ricezione del file completata."
End Select
End Sub
Private Sub Passivo_DataArrival(ByVal bytesTotal As Long)
Dim DATI() As Byte
TuttiBytes.Text = TuttiBytes.Text + Passivo.BytesReceived
Call Passivo.GetData(DATI)
If UBound(DATI) + LOF(FILEHANDLE) + 1 >= DIMENSIONEFILE Then
ReDim Preserve DATI(DIMENSIONEFILE - LOF(FILEHANDLE) - 1)
Put FILEHANDLE, , DATI
Avanzamento.Caption = LOF(FILEHANDLE) & " bytes ricevuti su " & DIMENSIONEFILE
AvanzamentoProgress.Max = DIMENSIONEFILE
AvanzamentoProgress.Value = LOF(FILEHANDLE)
Socket.SendData " +OK: FINE"
DoEvents
Passivo.Close
Close FILEHANDLE
FILEDASALVARE = ""
Stati.AddItem "Ricezione del file completata."
Else
Put FILEHANDLE, , DATI
Avanzamento.Caption = LOF(FILEHANDLE) & " bytes ricevuti su " & DIMENSIONEFILE
AvanzamentoProgress.Max = DIMENSIONEFILE
AvanzamentoProgress.Value = LOF(FILEHANDLE)
Socket.SendData " +OK: RECV " & LOF(FILEHANDLE)
End If
End Sub