@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):
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]