Ciao ragazzi ho ancora problemi con winsock.
Ho creato due classi VB, clsSockOut (per la trasmissione) e clsSockIn (per la ricezione).
In clsSockOut ho:
codice:
Private Const cpn_OUT_REM_PORT = 1500
Private vpsConnType As String ' tipo connessione corrente
Private vpsClient As String ' num di telefono o indirizzo IP
Private vpsPath As String ' path contenente i file da inviare/ricevere
Private vpoOutFiles As New Collection ' collection dei file da inviare
Private vpnFileHandleOut As Long ' Handle del file da inviare (in trasmissione)
Private vpsFileOut As String ' Percorso del file da salvare
Private WithEvents vpoSockOut As Winsock ' socket trasferimento file
Private WithEvents vpoSockOutCn As Winsock ' socket controllo trasferimento file
(...)
Private Sub Class_Initialize()
(...)
' inizializzazione oggetti winsock
Set vpoSockOutCn = New Winsock
vpoSockOutCn.Protocol = sckTCPProtocol
Set vpoSockOut = New Winsock
vpoSockOut.Protocol = sckTCPProtocol
End Sub
(...)
Public Function Send() As Boolean
Dim vsIPClient As String
Dim vloItem As Variant
' crea l'elenco dei file
fpoOutFiles vpoOutFiles, vpsPath
' imposta destinazione dei file
vsIPClient = vpsClient
With vpoSockOutCn
' connessione sock controllo (invio)
If (.State <> sckClosed) Then .Close
.LocalPort = 0
.Connect vsIPClient, cpn_OUT_REM_PORT
' invio dei file
For Each vloItem In vpoOutFiles
' il formato di invio è CMD:"/FILE" NAME:"nome del file da inviare" DIM:"dimensione"
vpsFileOut = vpsPath & fpsGetAttr("NAME:", vloItem)
If (.State <> sckConnected) Then Exit Function
.SendData vloItem
Next
End With
End Function
In clsSockOut ho:
codice:
Private Const cpn_IN_LOC_PORT = 1500
Private vpsConnType As String ' tipo connessione corrente
Private vpsClient As String ' num di telefono o indirizzo IP
Private vpsPath As String ' path contenente i file da inviare/ricevere
Private vpnFileHandleIn As Long ' Handle del file da salvare (in ricezione)
Private vpsFileIn As String ' Percorso del file da salvare
Private WithEvents vpoSockIn As Winsock ' socket ricezione file
Private WithEvents vpoSockInCn As Winsock ' socket controllo ricezione file
Private Sub Class_Initialize()
' inizializzazione dei parametri
(...)
' inizializzazione oggetti winsock
Set vpoSockInCn = New Winsock
vpoSockInCn.Protocol = sckTCPProtocol
Set vpoSockIn = New Winsock
vpoSockIn.Protocol = sckTCPProtocol
' setta socket ricezione controllo in ascolto
With vpoSockInCn
.LocalPort = cpn_IN_LOC_PORT
.Listen
End With
End Sub
Private Sub vpoSockInCn_ConnectionRequest(ByVal requestID As Long)
With vpoSockInCn
.Close
.Accept requestID
End With
End Sub
Private Sub vpoSockInCn_DataArrival(ByVal bytesTotal As Long)
Dim vlvDati() As Byte
Dim vlsCmd As String
Dim vlnFileDim As Long
Dim vlsRisp As String
vpoSockInCn.GetData vlvDati
vlvDati = StrConv(vlvDati, vbUnicode)
vlsCmd = fpsGetAttr("CMD:", vlvDati)
Select Case (vlsCmd)
Case "/FILE"
vpsFileIn = fpsGetAttr("NAME:", vlvDati)
vlnFileDim = CLng(fpsGetAttr("DIM:", vlvDati))
With vpoSockIn
If (.State <> sckClosed) Then .Close
.LocalPort = 0
.Listen
vlsRisp = "CMD:<+OK PORTA> PORTA:<" & .LocalPort & ">"
vpoSockInCn.SendData vlsRisp
End With
Case Else
' comando non riconosciuto
End Select
End Sub
Il funzionamento è questo:
Richiamando il metodo "Send" della classe clsSockOut io mi connetto al socket di ricezione con il metodo
.LocalPort = 0
.Connect vsIPClient, cpn_OUT_REM_PORT
di conseguenza scatta l'evento vpoSockInCn_ConnectionRequest sulla classe clsSockIn (su un'altro PC)
di seguito quando devo inviare dati tramite l'istruzione .SendData vloItem presente nella classe clsSockOut nel metodo Send l'evento vpoSockInCn_DataArrival non scatta come invece dovrebbe.
Dove sbaglio? Perchè a connetersi si connette ma ad inviare dati no?
Grazie, saluti.