Netzwerk - IDs verwalten etc.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

ich versuch dir mal das verständlich rüber zu bringen, was Kiffi dir in
seinen kurzen und knappen Post sagen wollte:

1. Das hier ist ein relativ kleines Forum, wer sinnvolle und produktive
Antworten erwartet sollte weit mehr als 24 Stunden einplanen. Kannst ja
mal im Forum rumsuchen, jeder der nach so kurzer Zeit sich zurück
meldet und sich "beschwert", das keiner geantwortet hat, bekommt von
irgend einem anderen user solch einen Kommentar. Beschwert schließt
auch den versuch des "Pushens" seiner Threads ein.

2. "Neu" bedeutet, er ist selten bis garnicht im Forum an zu treffen. Jeder
User der alle paar Monate oder gar nur jedes Jahr mal was schreibt ist
nun mal nicht sehr bekannt. Demnach fällt er unter die Kategorie "Neu".
Selbst wenn er das über Jahrzehnte macht ist er immer noch sehr
unbekannt und somit "Neu".

3. Wie du in den Wald hineinrufst kommt es auch wieder hinaus. Wenn du
jemanden kritisierst, weil er dich auf einen Fehler hinweist, musst du
damit rechnen, entsprechende Antworten zu bekommen. Natürlich kommt
es auf die jeweiligen User an, was dann zurück kommt. Was bei Kiffi
passiert, hast du ja nun lesen können.

4. Mit deiner Art, Posts zu schreiben wird sich kaum einer dazu bereit
schlagen lassen, dir zu helfen. Du läufst sogar darauf hinaus, auch für
zukünftige Fragen potenzielle Helfer ab zu schrecken. Aber das scheint ja
in deinem Interresse zu sein, denn so läufst du nicht gefahr, unproduktive
Gespräche führen zu müssen oder gar dich zu "outen". Wo bei du dich
auch immer Outen musst. Wenn du negative erfahrung gesammelt hast,
tut es mir für dich leid, aber wer Fehler macht muss damit rechnen,
berichtigt zu werden. Und wer damit nicht klar kommt wird früher oder
später Probleme in jedem Forum haben.

Und bevor du Antwortest ... das ist alles andere als unproduktiv. Das
heißt so fern du lernfähig bist, du das beherziegst und meinen Post
verstehst, hat es Sinn gehabt. Bist du nicht in der Lage das obige zu
begreifen, wirst du hier im Forum noch viel Spaß haben. Dann ist Kiffi nur
der Anfang. Allerdings ist das Forum voll von diesen Typen, Ironie jeder
Form wirst du hier antreffen können. Das ist aber selten Böse gemeint.

Aja ... der ganze Post ist informativ und ein wenig ironisch Geschrieben.
Also nicht alles zu ernzt nehmen :wink: ... wie halt das ganze Forum :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Just_reading
Beiträge: 13
Registriert: 26.07.2006 03:26

Beitrag von Just_reading »

Das Kommentar hätte sich Kiffi genauso sparen können wie smateja seinen Highlightpost.
Ich glaube auch nicht daß smateja eine Unterweisung in guter Führung braucht.

Er scheint doch ein ganz netter Kerl zu sein. Auch wenn er jetzt ins falsche Licht gerückt wird.

Sollte sowas hier üblich sein, werde ich mir überlegen ob es richtig war mich hier anzumelden.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

RE:

Beitrag von smateja »

okay - also erstmal sorry an kiffi - das sollte nicht irgendwie pissig etc rüberkommen und auch kein pers. Angriff werden - und okay - sollte mich auch ein wenig in gedult üben, gebe ich zu - aber hey - bin gerade so heiß auf proggen nebenher - ich brauch infos *G

an alle die bislang hier was gepostet haben mal n dickes merci - aber evtl. hat ja noch wer n link übrig oder n treffenderes beispiel dass ich das evtl besser verstehen kann (auf das ursprüngliche Problem).
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

du meinst deine letzte Frage? Also wie du es hin bekommst, das etwas an
alle anderen Clients gesendet wird außer dem, der es zum Server
sendete?

Im prinzip ganz einfach *lol*
Also du kennst die ID jedes Clients, die hast du ja in der Liste
gespeichert. Nun nutzt du "Foreach" (näheres in der Hilfe :D ) um erst
mal alle aktuellen clients durch gehen zu können. Solltest du eine sehr
alte PB Version nutzten gibt es da auch eine alternative. Aber dafür
müsstest du uns erst mal mitteilen, welche PB Versin du nutzt. Ich hoffe
ich habs nicht überlesen :D .

In der Schleife hast du nun eine IF-Abfrage mit welcher du die ID des
aktuellen Clients mit der ID des Clients vergleichst, welche den Befehl
zum Senden geschickt hat. Ist die ID nicht gleich, wird dieses "Repeat" zu
der ID gesendet.

Hoffe verstanden :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

re:

Beitrag von smateja »

Code: Alles auswählen


ResetList (User())
              ForEach User()
                If User()\ClientID <> ClientID
                  SendNetworkString (User()\ClientID , ""+PeekS(NetzwerkPuffer))
                EndIf
              Next

Habs nun wie oben beschrieben gelößt.
PB 4.6 / 32 Bit / 64 Bit
Just_reading
Beiträge: 13
Registriert: 26.07.2006 03:26

Beitrag von Just_reading »

Sehr gut.
Und wie bist du njun drauf gekommen ? ;-)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

er hat meine Post gelesen :wink: oder was meinst du?

freut mich das er für dich verständlich war smateja :D

Code: Alles auswählen

Resetlist(User())
brauchst du aber nicht, wenn du ForEach verwendest wird automatisch
jedes Element der Liste durchlaufen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

RE:

Beitrag von smateja »

ah merci - gleich korrigert
PB 4.6 / 32 Bit / 64 Bit
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Nues Problem

Beitrag von smateja »

ich schaffs derzeit leider nicht den NEtzwerkcode getrennt vom anderen in einem eigensteändigen Thread laufen zu lassen - bekomm hier immer dann n fehler in der zeile 83 wo delay steht - warum versteh ich net - evtl. übergebe ich an die prozedur die daten falsch? - evtl. jemand ne idee oder lösung?

Code: Alles auswählen

;00009



Main_Delay=3

Structure client_structure
  ClientID.l
  ClientIP.l
  ClientPort.l
  ClientSocket.l
  
  timeConnect.l
  timeUpdate.l
  
  inData.s
  outData.s
  inFile.s
  outFile.s
  
  login.s
  passwd.s
  rights.l
EndStructure

NewList User.client_structure()



OpenWindow(00001,0,0,800,600,"(H)iveworx (S)erver (S)ystem",#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(00001))

      CreateStatusBar(00002, WindowID(00001))
              AddStatusBarField(70)
              AddStatusBarField(60)
              AddStatusBarField(80)
              AddStatusBarField(590)
              

      PanelGadget     (00003, 2, 2, 796, 574)    
              AddGadgetItem (00003, -1,"Status")
                    ButtonGadget(00009, 688,3,100,16, "Beenden") 
  
              AddGadgetItem (00003, -1,"Log")
                  ListIconGadget(00004,2, 2, 786, 500, "Datum", 62,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
                    AddGadgetColumn(00004, 1, "Zeit", 62)
                    AddGadgetColumn(00004, 2, "Client-ID", 80)
                    AddGadgetColumn(00004, 3, "IP", 80)
                    AddGadgetColumn(00004, 4, "Event", 498)    
              AddGadgetItem (00003, -1,"Einstellungen")
                    Frame3DGadget(00005, 10,  10, 340, 50, "Performance Einstellungen")
                    SpinGadget(00006, 90, 28, 40, 20, 0, 50 ,#PB_Spin_Numeric)
                          SetGadgetText(00006, ""+Str(Main_Delay) )
                    ProgressBarGadget(00008, 140, 28, 200, 20, 0, 100,#PB_ProgressBar_Smooth) 

                    TextGadget(00007, 20, 30, 100, 20, "Main-Delay") 
  
              AddGadgetItem (00003, -1,"")
              AddGadgetItem (00003, -1,"")

          
      CloseGadgetList()

CreateThread(@server,0) 

Repeat

Delay(Main_Delay)
Main_Delay = GetGadgetState(00006) 
SetGadgetState(00008, CpuUsage())

StatusBarText(00002, 1, FormatDate("%hh:%ii:%ss", Date()),#PB_StatusBar_Center)
StatusBarText(00002, 0, FormatDate("%dd.%mm.%yyyy", Date()),#PB_StatusBar_Center) 
StatusBarText(00002, 2, "Clients: "+Str(CountList(User())),#PB_StatusBar_Center  )


  Event=WindowEvent()  
  
  
  If Event = #PB_Event_Gadget
        Select EventGadget()
          Case 00009:
            End
        EndSelect
  EndIf
  
  
    
     
  Until Quit = 1 
  
CloseNetworkServer(0)








Procedure server(User.client_structure()) 

InitNetwork()
CreateNetworkServer(10001, 6060, #PB_Network_TCP)

AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+""+Chr(10)+"localhost"+Chr(10)+"Server gestartet")

Repeat

  SEvent = NetworkServerEvent()


If SEvent
    
      ClientID = EventClient()
      ClientIP = GetClientIP(ClientID) 
      
      NetzwerkPuffer = AllocateMemory(1000)
       
      Select SEvent
      
        Case 1
          AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+"Client connected")
              ForEach User()
                  If User()\ClientID = ClientID  
                    DeleteElement(User())
                    Break
                  EndIf   
              Next
               AddElement(User())
                User()\ClientID = ClientID
                User()\ClientIP = GetClientIP(ClientID)
                User()\ClientPort = GetClientPort(ClientID)
                User()\ClientSocket = ConnectionID(ClientID)
  
                User()\timeConnect = Date()
                User()\timeUpdate= Date()
  
                User()\inData = ""+PeekS(NetzwerkPuffer)
                User()\outData = ""+PeekS(NetzwerkPuffer)
                User()\inFile = ""
                User()\outFile = ""
          
          
                  
                  
        Case 2
         ReceiveNetworkData(ClientID, NetzwerkPuffer, 1000)
         AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+PeekS(NetzwerkPuffer))
         
            ForEach User()
                If User()\ClientID <> ClientID
                  SendNetworkString (User()\ClientID , ""+PeekS(NetzwerkPuffer))
                EndIf
              Next
 
 
 
            ForEach User()
              If User()\ClientID = ClientID
                 DeleteElement(User())
                Break
              EndIf 
            Next
              AddElement(User())
                User()\ClientID = ClientID
                User()\ClientIP = GetClientIP(ClientID)
                User()\ClientPort = GetClientPort(ClientID)
                User()\ClientSocket = ConnectionID(ClientID)
  
                User()\timeConnect = Date()
                User()\timeUpdate= Date()
  
                User()\inData = ""+PeekS(NetzwerkPuffer)
                User()\outData = ""+PeekS(NetzwerkPuffer)
                User()\inFile = ""
                User()\outFile = ""
              
          
          
          
          
          If PeekS(NetzwerkPuffer)="/admin shutdown"
            End
          EndIf
                   
          FreeMemory(NetzwerkPuffer)
          
        Case 4
          AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+"disconnected")
              ForEach User()
                If User()\ClientID = ClientID
                    DeleteElement(User())
                    Break
                EndIf
              Next
    
      EndSelect
    EndIf

Until Quit=1

EndProcedure 




PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Habe mal grob überschaut. (PB4)

1. Global NewList User. ...

2. im Case 2 brauch nicht jedes mal der user gelöscht und neu angelegt werden. Dieses geschied in Case 4

3. i Case 1 gibt es noch keine Daten zum zuweisen. Also "PeekS(NetzwerkPuffer)" ist unnötig

4. Mit "Declare" die Procedure bekannt machen da sie erst im Code Später folgt.

5. CreateThread(@server,0) -> CreateThread(@server(),0)

Code: Alles auswählen

;00009



Main_Delay=3

Structure client_structure
  ClientID.l
  ClientIP.l
  ClientPort.l
  ClientSocket.l
 
  timeConnect.l
  timeUpdate.l
 
  inData.s
  outData.s
  inFile.s
  outFile.s
 
  login.s
  passwd.s
  rights.l
EndStructure

Global NewList User.client_structure()

Declare server(id.l)

OpenWindow(00001,0,0,800,600,"(H)iveworx (S)erver (S)ystem",#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(00001))

      CreateStatusBar(00002, WindowID(00001))
              AddStatusBarField(70)
              AddStatusBarField(60)
              AddStatusBarField(80)
              AddStatusBarField(590)
             

      PanelGadget     (00003, 2, 2, 796, 574)   
              AddGadgetItem (00003, -1,"Status")
                    ButtonGadget(00009, 688,3,100,16, "Beenden")
 
              AddGadgetItem (00003, -1,"Log")
                  ListIconGadget(00004,2, 2, 786, 500, "Datum", 62,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
                    AddGadgetColumn(00004, 1, "Zeit", 62)
                    AddGadgetColumn(00004, 2, "Client-ID", 80)
                    AddGadgetColumn(00004, 3, "IP", 80)
                    AddGadgetColumn(00004, 4, "Event", 498)   
              AddGadgetItem (00003, -1,"Einstellungen")
                    Frame3DGadget(00005, 10,  10, 340, 50, "Performance Einstellungen")
                    SpinGadget(00006, 90, 28, 40, 20, 0, 50 ,#PB_Spin_Numeric)
                          SetGadgetText(00006, ""+Str(Main_Delay) )
                    ProgressBarGadget(00008, 140, 28, 200, 20, 0, 100,#PB_ProgressBar_Smooth)

                    TextGadget(00007, 20, 30, 100, 20, "Main-Delay")
 
              AddGadgetItem (00003, -1,"")
              AddGadgetItem (00003, -1,"")

         
      CloseGadgetList()

CreateThread(@server(),0)

Repeat

Delay(Main_Delay)
Main_Delay = GetGadgetState(00006)
;SetGadgetState(00008, CpuUsage())

StatusBarText(00002, 1, FormatDate("%hh:%ii:%ss", Date()),#PB_StatusBar_Center)
StatusBarText(00002, 0, FormatDate("%dd.%mm.%yyyy", Date()),#PB_StatusBar_Center)
StatusBarText(00002, 2, "Clients: "+Str(CountList(User())),#PB_StatusBar_Center  )


  Event=WindowEvent() 
 
 
  If Event = #PB_Event_Gadget
        Select EventGadget()
          Case 00009:
            End
        EndSelect
  EndIf
 
 
   
     
  Until Quit = 1
 
CloseNetworkServer(0)


Procedure server(ID.l)

InitNetwork()
CreateNetworkServer(10001, 6060, #PB_Network_TCP)

AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+""+Chr(10)+"localhost"+Chr(10)+"Server gestartet")

Repeat

  SEvent = NetworkServerEvent()


If SEvent
   
      ClientID = EventClient()
      ClientIP = GetClientIP(ClientID)
     
      NetzwerkPuffer = AllocateMemory(1000)
       
      Select SEvent
     
        Case 1
          AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+"Client connected")
              ForEach User()
                  If User()\ClientID = ClientID 
                    DeleteElement(User())
                    Break
                  EndIf   
              Next
               AddElement(User())
                User()\ClientID = ClientID
                User()\ClientIP = GetClientIP(ClientID)
                User()\ClientPort = GetClientPort(ClientID)
                User()\ClientSocket = ConnectionID(ClientID)
 
                User()\timeConnect = Date()
                User()\timeUpdate= Date()
 
                User()\inData = ""+PeekS(NetzwerkPuffer)
                User()\outData = ""+PeekS(NetzwerkPuffer)
                User()\inFile = ""
                User()\outFile = ""
         
         
                 
                 
        Case 2
         ReceiveNetworkData(ClientID, NetzwerkPuffer, 1000)
         AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+PeekS(NetzwerkPuffer))
         
            ForEach User()
                If User()\ClientID <> ClientID
                  SendNetworkString (User()\ClientID , ""+PeekS(NetzwerkPuffer))
                EndIf
              Next
 
 
 
            ForEach User()
              If User()\ClientID = ClientID
                 DeleteElement(User())
                Break
              EndIf
            Next
              AddElement(User())
                User()\ClientID = ClientID
                User()\ClientIP = GetClientIP(ClientID)
                User()\ClientPort = GetClientPort(ClientID)
                User()\ClientSocket = ConnectionID(ClientID)
 
                User()\timeConnect = Date()
                User()\timeUpdate= Date()
 
                User()\inData = ""+PeekS(NetzwerkPuffer)
                User()\outData = ""+PeekS(NetzwerkPuffer)
                User()\inFile = ""
                User()\outFile = ""
             
         
         
         
         
          If PeekS(NetzwerkPuffer)="/admin shutdown"
            End
          EndIf
                   
          FreeMemory(NetzwerkPuffer)
         
        Case 4
          AddGadgetItem(00004, -1, FormatDate("%mm.%dd.%yyyy", Date())+Chr(10)+FormatDate("%hh:%ii:%ss", Date())+Chr(10)+Str(ClientID)+Chr(10)+IPString(ClientIP)+Chr(10)+"disconnected")
              ForEach User()
                If User()\ClientID = ClientID
                    DeleteElement(User())
                    Break
                EndIf
              Next
   
      EndSelect
    EndIf

Until Quit=1

EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten