|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Città: Taranto
Messaggi: 418
|
Acettare Id Tramite Autenticazione
salve ho un problema in vb cm sapete nn lo conosco bene cmq...
ho fatto un prog di file transfer tra due pc.. praticamente vorrei che il server quando ha la richiesta di connessione del client, accetta solo tramite un nome utente e password che il client deve dare... cm devo fare?
__________________
11001010110011001010 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Un modo molto semplice è...una volta accettata la connessione il programma che funge da server attende dei dati...i primi, che so, 32 byte rappresentano user è password dell'utente connesso. Li verifica e se sono ok, bene, altrimenti chiude la connessione...
Ho fatto anch'io recentemente un programma di questo tipo (scambio file tra 2 pc)...puoi dirmi che funzionalità hai inserito? Aloha!
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2003
Città: Taranto
Messaggi: 418
|
potresti darmi una mano per fare quello ke hai detto?
questo è il client: Option Explicit Dim buffer() As Byte Dim lBytes As Long Dim temp As String Private Sub cmdBrowse_Click() dlg.ShowOpen txtFile = dlg.FileName End Sub Private Sub cmdSend_Click() cmdSend.Enabled = False lBytes = 0 ReDim buffer(FileLen(dlg.FileName) - 1) Open dlg.FileName For Binary As 1 Get #1, 1, buffer Close #1 Load wsTCP(1) wsTCP(1).RemoteHost = txtIP wsTCP(1).RemotePort = 999 wsTCP(1).Connect lblStatus = "Connecting..." End Sub Private Sub wsTCP_Close(Index As Integer) lblStatus = "Connection closed" Unload wsTCP(1) End Sub Private Sub wsTCP_Connect(Index As Integer) lblStatus = "Connected" wsTCP(1).SendData dlg.FileTitle & vbCrLf End Sub Private Sub wsTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long) wsTCP(1).GetData temp If InStr(temp, vbCrLf) <> 0 Then temp = Left(temp, InStr(temp, vbCrLf) - 1) If temp = "OK" Then wsTCP(1).SendData buffer Else lblStatus = "Something wrong" Unload wsTCP(1) cmdSend.Enabled = True End If End Sub Private Sub wsTCP_SendComplete(Index As Integer) If temp = "OK" Then lblStatus = "Send complete" temp = "" Unload wsTCP(1) cmdSend.Enabled = True End If End Sub Private Sub wsTCP_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long) If temp = "OK" Then lBytes = lBytes + bytesSent lblStatus = lBytes & " out of " & UBound(buffer) & " bytes sent" End If End Sub e questo è il server: Option Explicit Dim lPos As Long Dim bOK As Boolean Dim fname As String Private Sub cmdRun_Click() If cmdRun.Caption = "Run" Then cmdRun.Caption = "Stop" wsTCP(0).LocalPort = 999 wsTCP(0).Listen Else wsTCP(0).Close cmdRun.Caption = "Run" End If End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive & "\" End Sub Private Sub wsTCP_Close(Index As Integer) Close #1 Unload wsTCP(1) bOK = False End Sub Private Sub wsTCP_ConnectionRequest(Index As Integer, ByVal requestID As Long) Load wsTCP(1) wsTCP(1).Accept requestID lblip = wsTCP(0).RemoteHostIP lblhost = wsTCP(0).RemoteHost End Sub Private Sub wsTCP_DataArrival(Index As Integer, ByVal bytesTotal As Long) If Not bOK Then wsTCP(1).GetData fname If InStr(fname, vbCrLf) <> 0 Then fname = Left(fname, InStr(fname, vbCrLf) - 1) bOK = True If Dir(Dir1.Path & "\" & fname) <> "" Then Kill Dir1.Path & "\" & fname Open Dir1.Path & "\" & fname For Binary As 1 lPos = 1 wsTCP(1).SendData "OK" & vbCrLf Else Dim buffer() As Byte wsTCP(1).GetData buffer Put #1, lPos, buffer lPos = lPos + UBound(buffer) + 1 End If End Sub grazie
__________________
11001010110011001010 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2002
Messaggi: 487
|
Più che editare il tuo codice preferisco farti un esempio.
Definiamo un tipo di dati enumerativo: Codice:
Private Enum LoginState verifyLogin = 0 clientConnected = 1 waitForConnect = 2 End Enum dim serverState as LoginState Quando inizializzi il server poni serverState = waitForConnect Quando nel server hai l'evento ConnectionRequest, all'interno di tale procedura fai l'assegnazione : serverState = verifyLogin Ed eccoci al cuore di tutto, la procedura dell'evento DataArrival Codice:
Private Sub WinSock1_DataArrival(ByVal bytesTotal As Long) dim MyData with WinSock1 select case serverState case verifylogin: if . BytesReceived < 32 then exit sub .GetData MyData, vbArray + vbByte, 32 if checkLogin(MyData) = false then .close serverState= waitForConnect else serverState= clientConnected end if case ClientConnected: .GetData MyData call useData(MyData) end select end with End Sub Private function checkLogin(MyData() as byte) as boolean ' fai un controllo che i primi 16 byte corrispondano ad un nome di login conosciuto ' e che i 16 byte successivi siano la password ad esso associata. Naturalmente puoi usare ' anche meno bytes, che so, 16, 8 per la login e 8 per la passw. Se c'è un riscontro ' positivo restituisci true, altrimenti false end function Private sub useData(myData) ' Quando sei connesso utilizza i dati come meglio credi ;) end Sub Aloha!
__________________
AcM Racing :: Nulla è impossibile per chi non deve farlo |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:31.



















