Login-Server mit Name und Passwort??

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Login-Server mit Name und Passwort??

Beitrag von nco2k »

hi folks,

gibt es irgendwelche leicht zu verstehenden und natürlich in purebasic geschriebenen beispiele, zu einem sehr simplen client und server system, mit name und passwort eingabe?! kenn mich da leider nicht aus. :cry:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Soll es denn für LAN sein oder soll der Server via Internet erreicht werden oder was soll das für ein Client und für ein Server sein?

Ansonsten solltest du dich mal mit dem Thema Client-Server der Network-Lib vertraut machen und ein paar Verschlüsselungsmethoden ansehen. Etwa MD5-Fingerprint oder so. Damit lässt sich sowas machen.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

erstmal lan bzw. local natürlich, wenn ich den dann online stellen wollen würde, würde ich es mit port forwarding am router machen.

er soll eigentlich so gesehen nichts machen. ich will nur was zum übungszweck erstmal zusammenstellen und dann seh ich weiter.

an so was in der art dachte ich:

1.) user startet client programm, schreibt name und passwort und drückt auf den senden button.
2.) server empfängt die daten und prüft (anhand einer textdatei, in welcher die daten des jeweiligen users, gespeichert sind) die gültigkeit und sendet ereigniss zurück (erfolgreich eingeloggt, user bereits eingeloggt, name und/oder passwort falsch usw.).
3.) client bekommt begrüssung "hallo XYZ..." (oder infos über seinen "account")

und das wars....

das mit der verschlüsselung kann ich ja immernoch im nachhinein einbauen. ich will aber erstmal klein anfang und wie gesagt, es dient überwiegend nur zum übungszweck. was dann daraus noch wird und ob überhaupt, seh ich ja dann. :wink:

p.s.: was ich auch nicht so ganz verstehe ist AllocateMemory(1000) (vom server example aus der pb hilfe). wieso ausgerechnet der wert von 1000?? wie berechnet man das?? wie verhält sich das ganze wenn mehrere user (sagen wir ganz übertrieben 2000 user) sich einloggen?? braucht man für jeden user dann einen eigenen festgelegten speicherbereich??

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

suche oder besser lass andere suchen.

Beitrag von Helmut »

lass da Folk doch lieber suchen, statt selber mit der Suchfunkion zu arbeiten. Das scheint mir der Tenor zu sein.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@Helmut
total überflüssig. /:->

hättest dir auch sparen können oder wenigstens die beiträge verlinken, wenn du welche gefunden hast. ach lass mich raten, du hast nichts gefuden, weil du garnicht gesucht hast?! tja, ich hab (wie immer) gesucht, aber leider nichts gefunden, sonst hätte ich ja garnicht erst gefragt oder?? :roll:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Helmut
Beiträge: 162
Registriert: 20.09.2004 22:53

Der Code ist nicht von mir ! Suchbegriff: FTP Password !

Beitrag von Helmut »

ÜBERFLÜSSIG ... kann man sehen wie man will, manches ist gar nicht so schwer. Aber man kann sich's auch leicht machen....
Schau mal

Code: Alles auswählen

Procedure sendftp(send$)
  ; Daten lokal in comdata.txt speichern
  CreateFile(#df,"comdata.txt")
  WriteString(send$)
  CloseFile(#df)
  ; Die Datei comdata.txt an den Server senden
  Proxy.s=""
  ProxyBypass.s=""
  ServerName.s="Internetseite"
  UserName.s="Username"
  Password.s="Password"
  localfile.s="textfile.txt"; zu übertragene Datei
  remotefile.s="wohin_mit_dem_text.txt"
  hInternet=InternetOpen_("FTP",#INTERNET_OPEN_TYPE_DIRECT,Proxy,ProxyBypass,0)
  If hInternet
    hConnect=InternetConnect_(hInternet,ServerName,#FTP_PORT,UserName,Password,#INTERNET_SERVICE_FTP,0,0)
    If hConnect
      If FtpPutFile_(hConnect,localfile,remotefile,#FTP_TRANSFER_ASCII,0)
        ;MessageRequester("","File has been sent",0)
      Else
        MessageRequester("Error", "Failure while sending file...",0)
      EndIf
    Else
      MessageRequester("Error", "Couldn't get a connection to the server!",0)
    EndIf
    InternetCloseHandle_(hInternet)
  Else
    MessageRequester("Error", "Internet isn't reachable.",0)
  EndIf
  SetGadgetText(#wg,url$+"?CMD=1")
EndProcedure
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

keiner hat was von ftp gesagt. winapi würde ich in diesem fall auch vermeiden... dein code beinhaltet nichts von den pb internen netzwerk befehlen... /:->

ich wollte doch nur ein simples beispiel mit dem pb internen befehlen und sehr wenig api (wenn es unbedingt sein muss).

Code: Alles auswählen

Repeat
  SEvent.l = NetworkServerEvent()
  If SEvent
    ClientID = NetworkClientID()
    Select SEvent
      Case 1 ;<--- jeder kann sich ohne name+passwort einloggen... geht das auch anders?!
        ;
      Case 2
        ;
      Case 4
        ;
    EndSelect
  Else
    Delay(20)
  EndIf
ForEver
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

@Helmut:

Ich glaube (ohne dass ich deine Procedure jetz komplett gelesen hätte) das ist nicht ganz das was nco2k sucht...
Ich vermute mal er meinte eher sowas in der art hier:

Server:

Code: Alles auswählen

;Initialisiern der Netzwerkfunktionen
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End
EndIf


Enumeration
  #Server
EndEnumeration

Enumeration
  #UsernameTXT
  #UsernameInput
  #Connect
EndEnumeration

Username.s
Password.s
Text.s
ClientID.l
PasswordNeeded.l = 0
Buffer           = AllocateMemory(100)


Procedure Open_Server()
  OpenWindow(#Server, 216, 0, 100, 20,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Server")       
  CreateNetworkServer(4096); Öffnen des Servers
EndProcedure


Open_Server()


Repeat
  
  Event = WindowEvent() 
  ServerEvent = NetworkServerEvent()
 
  If ServerEvent = 1      
    ClientID = NetworkClientID() ;Speichern der UserID des neu hinzugekommenen Users     
  ElseIf ServerEvent = 2        ;Empfang von Rohdaten und anschliessender vergleich mit diversen Werten
    length = ReceiveNetworkData(ClientID, Buffer, 100)
    Text = PeekS(Buffer, length)
      If PasswordNeeded = 0
        OpenPreferences("Users.txt")
          PreferenceGroup(Text)
            Password = ReadPreferenceString("Password", "")
        ClosePreferences()
         SendNetworkString(ClientID, "Password")
         PasswordNeeded = 1
      Else
        If Text = Password
          SendNetworkString(ClientID, "Granted")
          PasswordNeeded = 0
        EndIf 
        If Text <> Password 
          SendNetworkString(ClientID, "Denied")
        EndIf 
      EndIf 
  EndIf 
     

Delay(1)
 
Until Event = #PB_EventCloseWindow
CloseNetworkServer()
End
Client:

Code: Alles auswählen

;- Initialisiern der Netzwerkfunktionen
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0) 
    End
EndIf


Enumeration
  #Client
EndEnumeration

Enumeration
  #UsernameTXT
  #UsernameInput
  #Connect
EndEnumeration

Username.s
Password.s
Text.s
Buffer = AllocateMemory(100)


Procedure Open_Client()
  If OpenWindow(#Client, 216, 0, 200, 60,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Client")       
    If CreateGadgetList(WindowID())
      TextGadget(#UsernameTXT, 10, 10, 60, 20, "Username:")
      StringGadget(#UsernameInput, 70, 5, 110, 20, "")
      ButtonGadget(#Connect, 10, 30, 170, 20, "Connect")      
    EndIf  
  EndIf
EndProcedure

Open_Client()

Repeat
  
  Event = WindowEvent()
  
  If Event = #PB_EventGadget
      
    
    GadgetID = EventGadgetID()
    
    If GadgetID = #UsernameInput
      Username = GetGadgetText(#UsernameInput)                           ;Den Usernamen abfragen und in der entsprechenden Variable speichern  
      
    ElseIf GadgetID = #Connect
      ConnectionID = OpenNetworkConnection("192.168.0.1", 4096)          ; Hier wird auf den lokalen server connected. (IP je nach bedarf anpassen)  
        If ConnectionID = 0
          MessageRequester("Error", "Can't open network connection !", 0); Falls keine Verbindung möglich ist, Fehler ausgeben    
        EndIf 
      
      SendNetworkString(ConnectionID, Username)                          ; Hier wird der Username verschickt

      
    EndIf
    
  EndIf
  
  If ConnectionID <> 0
     ClientEvent = NetworkClientEvent(ConnectionID)
      
      If ClientEvent = 2                                       ;Falls rohdaten geschickt wurden (in unserem fall nur strings)...
        length = ReceiveNetworkData(ConnectionID, Buffer, 100) ;... lesen wir diese direkt in den bereitgestellten Speicher und speichern das in der variable length...
        Text = PeekS(Buffer, length)                           ;... und lesen diesen speicherbereich anschliessend aus (als string da wir hier nur mit strings arbeiten wie gesagt)
                                   ; Hier werden die verschiedenen möglichkeiten der Server Antworten aufgelistet und auch die folgen daraus.
          If Text = "Password"     ; Bei diesem Befehl werden wir dazu aufgefordert das entsprechende Passwort einzugeben
            Password = InputRequester("Enter your password", "In order to get Acces to the account of" + Username + " you must enter the right password!", "Enter here") 
            SendPassword = 1                      ; Das password wird gespeichert...
          ElseIf Text = "Granted" ; Hier hat alles wunderbar geklappt
            MessageRequester("Congratulations!", "Congratulations! You successfully logged in!")
          ElseIf Text = "Denied"  ; Hier leider nicht
            MessageRequester("Error!", "The entered password is wrong!")
          EndIf
      EndIf 
      
      If SendPassword = 1 
        SendNetworkString(ConnectionID, Password) ;... und hier verschickt
        SendPassword = 0
      EndIf 
    
    
  EndIf 
        

Delay(1)

Until Event = #PB_EventCloseWindow

End
Zusatzlich sollte man noch eine Users.txt datei schreiben die im Ordner der executables liegt.

Inhalt der Users.txt (Beispielsweise):

Code: Alles auswählen

[XYZ]
Password = 123

Hab den Code eben schnell zusammengeschustert, bin mir sicher dass noch einige schönheitsfehler drin sind, man einiges optimieren kann und weiss nedmal ob des mit dem übertragen der Befehler per string so das non plus ultra ist, allerdings behaupte ich dass das ganze recht leicht zu verstehen und einigermaßen übersichtlich ist.

Nochmal kurz zur Erläuterung:
Der Client gibt seinen Benutzernamen an, mit dem druck auf Connect wird dieser an den Server übermittelt. Der Server öffnet nun die Users Datei, wechselt zu dem entsprechenden Benutzernamen, schriebt das PW in eine Variable, sendet eine Anfrage an den Client, dieser öfnnet den messagerequester, das PW wird eingegeben, und an den Server geschickt. Dieser überprüft es auf richtigkeit und schickt dementsprechend das Ergebnis an den Client.

Fleißaufgabe wäre jetzt noch Account infos in die Users.txt zu packen und auf wunsch anzuzeigen ;) (Speziell für nco)

Dass mit dem reservierten speicher erklärt sich dadurch, dass alle daten die man empfängt (bis auf Dateien) direkt in den Speicher geschrieben werden. Je nachdem wie groß der reservirte Speicherbreich ist, kann man natürlich unterschiedlich lange Nachrichten empfangen. Deshalb sollte man bei z.b. nem chat darauf achten, dass die eingegebene Nachricht nicht größer ist als der Buffer. Wenn extrem viele User auf einen einzelnen Server zugreiffen brauchst du natürlich einen dementsprechend großen Buffer. Wenn du die Nachrichtenlänge jedes users begrenzt sagen wir mal auf 250 (Bytes glaub ich ist die Einheit hier), und im server 1000Bytes reservierst wirst du wenn es dumm läuft mit mehr als 4 usern schwierigkeiten bekommen. Bei 4 usern allerdings ist es so als hätte jeder seinen eigenen speicherbereich, was natürlich nicht wahr ist, jeder hat nur 1/4 des gesamten bereichs :)
(So erkläre ich mir das ganze zumindest, also alle angaben ohne gewähr ^^)

Mfg
RaVeN


[Edit]
Das mit dem Problem dass jeder sich einloggen kann, kannste schlecht umgehen - zumindest wüsste ich nicht wie - aber meine Möglichkeit sollte auch funktionieren, da man zwar connecten kann, aber keine Infos erhält...
Noch ne Fleißaufgabe:
Lass die user mit falschen zugangsdaten kicken ^^
[/Edit]
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@RaVeN99
vielen dank!

ich habe zwar deinen code nur ganz schnell überflogen, aber es sieht schon mal sehr gut aus, so als denkanstoss. danke auch für die sehr gute erklärung! die schönheitsfehler und fleißaufgaben, werd ich schon irgendwie hinkrigen. :wink:

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Bitte bitte, gern geschehen :)
Hab mich auch ersmal in das ganze zeug einarbeiten müssen, aber wenn mans einmal verstanden hat isses ganz simpel :)

Die Erklärungen sind aber - wie bereits gesagt, gerade was die Sache mit dem Buffer angeht nur meinem Kopf entsprungen, also nicht unter Garantie richtig :)

Würd mich freuen wenn dir das ganze weiterhilft, und auch wenn ich mal was zu sehen kriege von dem was du mit dem Code anstellst :)


Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Antworten