2 Clienten in Server einbinden.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

2 Clienten in Server einbinden.

Beitrag von funkheld »

Hallo, ich brauche noch einmal Hilfe,um 2 Clienten in den Server einzubinden.
Wie kann man es hier im Programm machen, das 2 nacheinander gestartete Clienten erfasst werden mit der ClientID ?

Danke.

Gruss

Code: Alles auswählen

Global z.l,offs.l,rdata.l,wert.l,motor.l,geschw.l,bremsdr.f
Global *rbuffer.l, *sbuffer.l,ClientID.l, ClientIP.l, Command.s

If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht initialisieren!")
  End
EndIf

If CreateNetworkServer(1, 1435) = 0
  PrintN("Server konnte nicht erstellt werden!")
  End
EndIf

*rbuffer = AllocateMemory(256)
*sbuffer = AllocateMemory(256)

OpenConsole()
Repeat
  
  Select NetworkServerEvent()
    Case 1     
    	ClientID = EventClient()
      ClientIP = GetClientIP(ClientID)
      PrintN("Client <" + IPString(ClientIP) + "> ist dem Server beigetreten.")
      PrintN(Str(ClientID))
    Case 2
      ClientID = EventClient()
      rdata=ReceiveNetworkData(ClientID, *rbuffer, 256)
      For z=0 To rData 
      	Print(Str(PeekB(*rbuffer+z)))
      	Print(" ")
      Next
    Case 4
    	ClientID = EventClient()
    	ClientIP = GetClientIP(ClientID)
      PrintN("Client <" + IPString(ClientIP) + "> hat den Server verlassen.")
  EndSelect
  
  Command = Inkey()
  If Command = "e"
    End
  ElseIf command="s"
    offs = 0 
    PokeL(*sbuffer + 0, $07) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeL(*sbuffer + 7, $0A) : offs + 1
    PokeA(*sbuffer + 8, $01) : offs + 1
    PokeA(*sbuffer + 9, $02) : offs + 1
    PokeA(*sbuffer + 10, $09) : offs + 1
    ClientID = EventClient()
    SendNetworkData(ClientID, *sbuffer, offs)
  EndIf
  Delay(5)
ForEver
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: 2 Clienten in Server einbinden.

Beitrag von Andreas21 »

mach es z.b. mit einer linkliste in der du die IDs speicherst und beim verbinden hinzufügst und beim trennen löschst.

Code: Alles auswählen

Command = Inkey()
  If Command = "e"
    End
  ElseIf command="s"
    offs = 0
    PokeL(*sbuffer + 0, $07) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeL(*sbuffer + 7, $0A) : offs + 1
    PokeA(*sbuffer + 8, $01) : offs + 1
    PokeA(*sbuffer + 9, $02) : offs + 1
    PokeA(*sbuffer + 10, $09) : offs + 1
    ClientID = EventClient()
    SendNetworkData(ClientID, *sbuffer, offs)
  EndIf
  Delay(5)
wenn kein Client verbunden ist und s gedrückt wird oder beide clients sich aus logen und s gedrückt wird kommt ein fehler weil unbekanter client.
ClientID = EventClient() braucst du da eigentlich nicht. Da du es oben im SELECT schon drin hast.

z.b. so:

Code: Alles auswählen

Global z.l,offs.l,rdata.l,wert.l,motor.l,geschw.l,bremsdr.f
Global *rbuffer.l, *sbuffer.l,ClientID.l, ClientIP.l, Command.s

If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht initialisieren!")
  End
EndIf

If CreateNetworkServer(1, 1435) = 0
  PrintN("Server konnte nicht erstellt werden!")
  End
EndIf

*rbuffer = AllocateMemory(256)
*sbuffer = AllocateMemory(256)

OpenConsole()
Repeat
 
  SEvent = NetworkServerEvent()
  ClientID = 0
  
  If SEvent

    ClientID = EventClient()
  
    Select SEvent
      Case #PB_NetworkEvent_Connect     
        ClientIP = GetClientIP(ClientID)
        PrintN("Client <" + IPString(ClientIP) + "> ist dem Server beigetreten.")
        PrintN(Str(ClientID))
      Case #PB_NetworkEvent_Data
        rdata=ReceiveNetworkData(ClientID, *rbuffer, 256)
        For z=0 To rData
          Print(Str(PeekB(*rbuffer+z)))
          Print(" ")
        Next
      Case #PB_NetworkEvent_Disconnect
        ClientIP = GetClientIP(ClientID)
        PrintN("Client <" + IPString(ClientIP) + "> hat den Server verlassen.")
        ClientID = 0
    EndSelect
  EndIf
 
  Command = Inkey()
  If Command = "e"
    End
  ElseIf command="s" And ClientID
    offs = 0
    PokeL(*sbuffer + 00, $07) : offs + 4
    PokeA(*sbuffer + 04, $00) : offs + 1
    PokeA(*sbuffer + 05, $03) : offs + 1
    PokeA(*sbuffer + 06, $00) : offs + 1
    PokeL(*sbuffer + 07, $0A) : offs + 4
    PokeA(*sbuffer + 11, $01) : offs + 1
    PokeA(*sbuffer + 12, $02) : offs + 1
    PokeA(*sbuffer + 13, $09) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)
  EndIf
  Delay(5)
ForEver
Zuletzt geändert von Andreas21 am 02.03.2012 19:34, insgesamt 2-mal geändert.
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Clienten in Server einbinden.

Beitrag von STARGÅTE »

Soll dieser Teil eigentlich falsch bleiben ?

Code: Alles auswählen

    
    PokeL(*sbuffer + 7, $0A) : offs + 1
    PokeA(*sbuffer + 8, $01) : offs + 1
Du schreibst eine Long (4 Byte), gehst dann aber nur 1 Byte weiter?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: 2 Clienten in Server einbinden.

Beitrag von Andreas21 »

Ok das hab ich übersehen da mir es nicht darum gegangen ist^^
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Clienten in Server einbinden.

Beitrag von STARGÅTE »

@Andreas21

Sry, hatte nicht dich gemeint, sondern funkheld, der hier Tag für Tag immer wieder seinen "zerstückelten" Code präsentiert, in dem immer noch die Fehler vom Vortag drin sind /:->
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: 2 Clienten in Server einbinden.

Beitrag von Kiffi »

STARGÅTE hat geschrieben:[...] sondern funkheld, der hier Tag für Tag immer wieder seinen "zerstückelten" Code präsentiert, in dem immer noch die Fehler vom Vortag drin sind /:->
ich frage mich sowieso, wieso diesem Menschen hier immer wieder geholfen wird...
a²+b²=mc²
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: 2 Clienten in Server einbinden.

Beitrag von funkheld »

Soll dieser Teil eigentlich falsch bleiben ?
Da ist ein L mit dem A vertrauscht worden.

Gruss
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: 2 Clienten in Server einbinden.

Beitrag von funkheld »

Kann mir einer bei der Übertragung helfen ?
Ich möchte mit dem Server "server" Daten empfangen vom Clienten(1 Byte) "zusi" und dann mit dem Server weiter übertragen nach dem Clienten "armatur".

Ich starte den "server" dann Client "zusi" und dann den Clienten "armatur", die Reihenfolge ist so auch in "Case 2" vom Server zur Abarbeitung der Daten.

Es klappt jetzt .

"server"

Code: Alles auswählen

Global *rbuffer.l, anz_id.l, rData.l

Dim ClientID.l(3)

InitNetwork() = 0

If CreateNetworkServer(1, 1435) = 0
  PrintN("Server konnte nicht erstellt werden!")
  End
EndIf

*rbuffer = AllocateMemory(256)

OpenConsole()
ConsoleTitle ("server")
Repeat
  
  Select NetworkServerEvent()
  	Case 1 
  		If anz_id < 3
  		  anz_id=anz_id+1
  		  ClientID(anz_id) = EventClient()
  		  PrintN(Str(ClientID(anz_id)))
  		EndIf  
  	Case 2
  		rdata=ReceiveNetworkData(ClientID(1), *rbuffer, 256) 
  		Delay(5)
  		SendNetworkData(ClientID(2), *rbuffer, rdata)  
  EndSelect
 
  Delay(5)
ForEver
"zusi"

Code: Alles auswählen

Global verb.l, sData.l, *sbuffer.l,command.s, summe.c

OpenConsole()
ConsoleTitle ("zusi")

InitNetwork() 

*sbuffer = AllocateMemory(256)

verb = OpenNetworkConnection("127.0.0.1", 1435)
Delay(200)

If verb 
	weiter:
	Command = Inkey()
	If command="q"
		summe=summe+1
		PokeB(*sbuffer,summe)
		sData = SendNetworkData(verb, *sbuffer, 1)
		PrintN("zur armatur: "+Str(summe))
         EndIf
  Delay(5)
  Goto weiter
  
  CloseNetworkConnection(verb)

EndIf

End
"armatur"

Code: Alles auswählen

Global rData.l, verb.l, CEvent.l, *rbuffer.l
Declare daten_empfang()

OpenConsole()
ConsoleTitle ("armatur")

InitNetwork() 

*rbuffer = AllocateMemory(256)

verb = OpenNetworkConnection("127.0.0.1", 1435)
Delay(200)

If verb  
  weiter: 
    daten_empfang()
    Delay(50)
  Goto weiter
  
  CloseNetworkConnection(verb)
EndIf

End

Procedure daten_empfang()
	rData = ReceiveNetworkData(verb, *rbuffer, 256)
	PrintN("von zusi: "+Str(PeekB(*rbuffer)))
EndProcedure	
Zuletzt geändert von funkheld am 02.03.2012 23:18, insgesamt 4-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: 2 Clienten in Server einbinden.

Beitrag von STARGÅTE »

ReceiveNetworkData() sollte erst aufgerufen werden, wenn ein voran gestelltes NetworkClientEvent() auch die Konstante #PB_NetworkEvent_Data zurück gab.

Das ist in deinem Code nicht der Fall.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: 2 Clienten mit Server einbinden.

Beitrag von funkheld »

Hmm..., danke.
Aber bei "armatur" habe ich das .
Wo kommt das denn bei "zusi" rein ? Bei "zusi" wird doch nur gesendet.

Danke.

Gruss
Zuletzt geändert von funkheld am 03.03.2012 18:14, insgesamt 1-mal geändert.
Antworten