Server - Client Protokoll und Datensicherheit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Server - Client Protokoll und Datensicherheit

Beitrag 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:
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag 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
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Cadogan
Beiträge: 22
Registriert: 27.05.2005 13:32
Kontaktdaten:

Beitrag von Cadogan »

Bau am besten nach NetworkServerEvent() noch ein Delay(1) ein, dann verbraucht dein Programm nicht mehr die gesamte CPU-Leistung :wink:
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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.
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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:
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Beitrag 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.
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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:
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Antworten