Seite 1 von 1

Server - Client Protokoll und Datensicherheit

Verfasst: 03.08.2005 08:12
von PAMKKKKK
Hallo !

Da ich gerade mit Server Client Programmieren anfange, sind das für mich Anfänger Fragen…..

Wenn ich mit CreateNetworkServer(Port) einen Server erstelle tun sich da viele Fragen auf:

1. Kann ich bestimmen ob der Server im TCP oder im UDP arbeitet?
2. Muss ich selber Netzwerk Pakete schnüren oder macht das PB für mich?
3. In wieweit muss ich mich selber um Datensicherheit kümmern ? z.B. wenn Pakete kaputt ankommen. 3a. werden die von PB neu angefordert oder von mir?
(für Daten Verschlüsselung sorge ich, ist ja klar!!)
4. Wie viele Client anfragen hält der PB Server auf einmal aus? 4a.Gibt es da wenn der Server Busy ist, schon ein Protokoll (Puffer) oder muss ich das machen?

Ich schätze mal da tauchen noch mehr Fragen auf.....ich muss loss...AAAAAbeiten :cry:

Verfasst: 03.08.2005 08:23
von stbi
1. Die Netzwerkfunktionen von PB arbeiten mit TCP.
2. Du musst Dich nur um den Inhalt kümmern.
3. Paket kaputt im Sinn von Inhalt verändert dürfte nicht passieren, das deckt TCP ab.
4. Eine zu einer Zeit. Aber Du kannst den Server multithreaded aufbauen, dann geht auch mehr.

Verfasst: 03.08.2005 12:44
von PAMKKKKK
@stbi
zu 4. es können sich mehrere Clients gleichzeitig mit dem Server verbinden. Es kann aber nur ein Server (ohne Threads) laufen.

:o :o :o :o Ich habe gerade gesehen das der Server 99% CPU Leistung braucht was ist denn das ?? :? :?

Gibt es da nict so eine Funktion wie WaitNetworkEvents(), die sich brav in die Ecke setzt und am Port horcht ??
Anstatt mit NetworkServerEvent() und einer Endlosschleife zu pollen ??

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

Procedure Server_tread(parameter)
  Buffer = AllocateMemory(1000)
  Repeat
  SEvent.l = NetworkServerEvent()
  If SEvent
  ClientID = NetworkClientID()
      Select SEvent
        Case 1
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
        Case 2
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(Buffer), 0)
          If UCase(PeekS(Buffer)) = "QUIT SERVER" 
            CloseNetworkServer()
            End 
          EndIf
        Case 3
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
      EndSelect
  EndIf
  Until Quit = 1 
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  CloseNetworkServer()
EndProcedure

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

Port = 6832
If CreateNetworkServer(Port)
  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  ThreadID = CreateThread(@Server_tread(), 154)
  WaitThread(ThreadID)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
  
End

Verfasst: 03.08.2005 13:22
von Cadogan
Bau am besten nach NetworkServerEvent() noch ein Delay(1) ein, dann verbraucht dein Programm nicht mehr die gesamte CPU-Leistung :wink:

Verfasst: 03.08.2005 13:56
von stbi
PAMKKKKK hat geschrieben:@stbi
zu 4. es können sich mehrere Clients gleichzeitig mit dem Server verbinden. Es kann aber nur ein Server (ohne Threads) laufen.
Ich formuliere es mal anders:
Ein PB-Serverprogramm kann nur genau einen Port bedienen.
Ein PB-Serverprogramm kann die Clientanfragen durchaus multithreaded bearbeiten. Das Beispielprogramm ist allerdings schon im Ansatz krottenfalsch was einen multithreaded server angeht.
Es können sich mehrere Clients gleichzeitig mit dem Server verbinden. Der Server kann, wenn nicht multithreaded, aber nur einen Client zu einer Zeit bedienen, so meinte ich das.

Verfasst: 03.08.2005 15:31
von DarkDragon
stbi hat geschrieben:
PAMKKKKK hat geschrieben:@stbi
zu 4. es können sich mehrere Clients gleichzeitig mit dem Server verbinden. Es kann aber nur ein Server (ohne Threads) laufen.
Ich formuliere es mal anders:
Ein PB-Serverprogramm kann nur genau einen Port bedienen.
Ein PB-Serverprogramm kann die Clientanfragen durchaus multithreaded bearbeiten. Das Beispielprogramm ist allerdings schon im Ansatz krottenfalsch was einen multithreaded server angeht.
Es können sich mehrere Clients gleichzeitig mit dem Server verbinden. Der Server kann, wenn nicht multithreaded, aber nur einen Client zu einer Zeit bedienen, so meinte ich das.
Man braucht nicht mehrere Threads um zwischen 10 Clienten unterscheiden zu können ;) . Aber da hast du schon recht, wenn es schnell gehen muss sind mehrere Threads sinnvoll.

Verfasst: 03.08.2005 16:09
von stbi
DarkDragon hat geschrieben:Man braucht nicht mehrere Threads um zwischen 10 Clienten unterscheiden zu können ;) . Aber da hast du schon recht, wenn es schnell gehen muss sind mehrere Threads sinnvoll.
Es geht nicht ums unterscheiden, sondern ums gleichzeitig bedienen. Ein klassischer multithreaded-Server arbeitet im Prinzip zunächst so wie im PB-Beispiel die repeat-networkserverevent-until-Schleife, nur startet der Server sobald ein Request reinkommt dafür einen extra Thread, dem er die zu bedienende Client-ID übergibt. Damit ist die Sache für den Serverprozess erledigt und er kann den nächsten Request annehmen. Die eigentliche Arbeit, z.B. eine Webseite aufzubereiten, machen die Threads. Ich hoffe, ich konnte das halbwegs verständlich erklären, wie ich das meine, oder auf gut schwäbisch: spür'sch wie i denk? :wink:

Verfasst: 03.08.2005 16:21
von DarkDragon
stbi hat geschrieben:
DarkDragon hat geschrieben:Man braucht nicht mehrere Threads um zwischen 10 Clienten unterscheiden zu können ;) . Aber da hast du schon recht, wenn es schnell gehen muss sind mehrere Threads sinnvoll.
Es geht nicht ums unterscheiden, sondern ums gleichzeitig bedienen. Ein klassischer multithreaded-Server arbeitet im Prinzip zunächst so wie im PB-Beispiel die repeat-networkserverevent-until-Schleife, nur startet der Server sobald ein Request reinkommt dafür einen extra Thread, dem er die zu bedienende Client-ID übergibt. Damit ist die Sache für den Serverprozess erledigt und er kann den nächsten Request annehmen. Die eigentliche Arbeit, z.B. eine Webseite aufzubereiten, machen die Threads. Ich hoffe, ich konnte das halbwegs verständlich erklären, wie ich das meine, oder auf gut schwäbisch: spür'sch wie i denk? :wink:
Ja, ich weiß was du meinst, mir brauchst du es nicht zu erklären.

Verfasst: 03.08.2005 21:02
von PAMKKKKK
Danke erstmal für die Hilfe!

@Cadogan
Delay() war auch mein erster Gedanke, aber ich habe mich nicht getraut es einzusetzen, da ein Server ja nicht pennen soll (wegen der Timeouts des Clienten).
Wenn man drüber nachdenkt ist es auch logisch….
Wenn nichts passiert dann Delay 1Ms, dadurch das die abfrage ja auch nur ein paar CPU-Zyklen dauert, ist die Routine Quasi im dauer delay/abfrage zustand.

Aber ich glaube ich habs jetzt ……
Wenn in der Hilfe zu CreateNetworkServer() steht, das man nur einen Server pro *.exe starten darf, und der dann den Port belegt.
Versteht man nicht gleich, das der Thread nicht neue Server erzeugt, sondern das die Verarbeitung der Server anfragen nur wie heiße Kartoffeln an neue Threads durchgereicht werden.

Verfasst: 04.08.2005 08:34
von stbi
PAMKKKKK hat geschrieben:Wenn in der Hilfe zu CreateNetworkServer() steht, das man nur einen Server pro *.exe starten darf, und der dann den Port belegt.
Der Satz ist richtig.
PAMKKKKK hat geschrieben:Versteht man nicht gleich, das der Thread nicht neue Server erzeugt, sondern das die Verarbeitung der Server anfragen nur wie heiße Kartoffeln an neue Threads durchgereicht werden.
Eben nicht. Das Beispielprogramm erzeugt den Server in einem separaten Thread, was relativ sinnlos ist. Es erzeugt keine Threads für die Bearbeitung der Clientanfragen!!!

@DarkDragon: wenigstens einer, der mich versteht! :lol: