Seite 1 von 2

Serverprobleme

Verfasst: 15.12.2004 08:11
von captain third
ich hab mal gedacht jetzt wo ich ein bisschen die grundlagen behersche,schreib ich mal ein server in einer console,naja für profis kein ding,aber ich mach natürlich wieder alles falsch,mein problem ist diesmal,wenn z.b. 2 clienten auf den server connecten,ist ja schön,aber wenn der eine client schreibt,muss es doch eigentlich auch der andere client lesen können,dacht ich mir jedenfalls so das es mal so war,hier der code vom server

Code: Alles auswählen

OpenConsole()
NewList Client.l() 
Buffer = AllocateMemory(1024) 
ConsoleTitle("Server")
initnetz=InitNetwork()
ConsoleColor(2,0)
If initnetz=0
 ConsoleColor(12,0)
 PrintN("Keine Verbindung zum Netzwerk")
 ConsoleColor(2,0)
Else
 PrintN("verbindung zum Netzwerk aufgebaut")
EndIf 
creatserver=CreateNetworkServer(600)
If creatserver=0
 ConsoleColor(12,0)
 PrintN("Kein Server gestartet,netzwerkfehler?")
 ConsoleColor(2,0)
Else
 PrintN("Server gestartet")
EndIf

Repeat


SEvent.l=NetworkServerEvent()
ClientID=NetworkClientID()


 Select SEvent
 
  Case 1
   Print("Ein neuer Client ist Online")
   AddElement (Client())
   Client()=ClientID 
   
  Case 2
   ReceiveNetworkData(ClientID , Buffer , 1000)
   PrintN(PeekS(Buffer))
    ForEach Client()
     If Client()=ClientID
      SendNetworkString(Client(), PeekS(Buffer))
     EndIf
    Next
   
  Case 3
   ;nix
   
  Case 4
   Print("Ein Client hat den Server verlassen")
   
 EndSelect

      
ForEver
FreeMemory(Buffer)
CloseConsole()
End
wär schön wenn ihr mir helfen könntet

Verfasst: 15.12.2004 08:14
von Laurin
2 clienten auf den server connecten,ist ja schön,aber wenn der eine client schreibt,muss es doch eigentlich auch der andere client lesen können
Das ist falsch. PB benutzt das Server-Client-Modell. Das heißt, Kommunikation läuft nur zwischen diesen. Client-Client-Verbindung ist nicht möglich, es sei denn, der eine startet einen Server.

Greetz Laurin

Verfasst: 15.12.2004 08:31
von captain third
hab ich mich falsch ausgedrückt???naja ich meine,jemand startet ein server,beide clienten connecten zu dem server,und wenn der eine client schreibt,muss der andere client es doch lesen können,meine vermutung is,das der fehler hier momentan im server ist,ich weiß nur nicht was,ich blick da net durch....:(

Verfasst: 15.12.2004 09:05
von Exabot
Hallo Captain,

du sendest zwar schön (mit for each) an alle Clients,
Du solltest vorher aber auch von allen empfangen.

Gruß
Spider

PS: ach ja, jeder Client braucht eventuell einen eigenen
Buffer!

Verfasst: 15.12.2004 10:13
von tranquil
Jeder verbundene Client auf der Serverseite braucht mit 100% Sicherheit einen eigenen Buffer. Zumindest wenn es richtig funktionieren soll. :-)

Verfasst: 15.12.2004 11:31
von stbi
Wenn mehrere Clients auf einen Server gleichzeitig Transaktionen durchführen sollen, dann ist für jeden Client ein eigener Serverthread notwendig!

Verfasst: 15.12.2004 15:40
von captain third
so wie ich das richtig sehe,fehlt etwas an meinem server,ich weiß nur nicht was,wiso verattets mir nicht, :cry: vom server aus will ich nicht schreiben,da soll nur was ankommen und an andere clienten weitergeleitet werden,aber aus irgendeinem grund funktioniert das net,kann mir jemand helfen?

Verfasst: 15.12.2004 15:59
von RaVeN99
Habs mir jetzt nicht genau angesehen, aber pack doch mal die zuweisung von ClientID in Case 1 rein... sprich:

Code: Alles auswählen

 Case 1 
   ClientID=NetworkClientID()
   Print("Ein neuer Client ist Online") 
   AddElement (Client()) 
   Client()=ClientID 
Irgendwie drängt sich mir grade die vermutung auf, dass du da andauernd mit ein und derselben ClientID rumhantierst, bzw mit garkeiner, denn die ID wird ja nicht in der Liste gespeichert, zwar frägst du sie ab, aber beim ersten schleifendurchlauf wird in ClientID einfach 0 geschrieben, da es keine clients gibt die connected sind. Im folgenden lässt du diese 0 in die Liste schreiben sobald ein neuer User (welcher ja als erster ne echte ID hat) connected, anstatt dessen ID zu schreiben...

Im Case 2 schickst du dann den string wiederum an alle connecteden user - leider haben die alle die ID 0 ---> da kann nichst ankommen ;)

Ausserdem kannst du dir die If-Schleife bei Case 2 sparen.

Fazit: verschiebe die zuweisung der ClientID nach Case1... so haste zumindest schonmal die richtigen ID's... aber da müsste noch irgendein Fehler drin sein - bin mir sicher dass ich den gerade übersehe... aber probier das ganze einfach mal aus :)

Ahja, guter tipp, gerade bei solchen sachen würde ich mir wichtige variablen per debug ausgeben lassen, dann siehste auch ob mit denen das gewünschte passiert oder nicht - und somit kommt man schnell selbst auf einige Fehler, notfalls per trial&error verfahren :allright:


Mfg
RaVeN

Verfasst: 15.12.2004 16:03
von captain third
Danke :mrgreen: :mrgreen: :mrgreen:

Verfasst: 15.12.2004 17:05
von ChaOsKid
meiner meinung nach scheitert es nur an zeile 41:

Code: Alles auswählen

If Client()=ClientID
denn da kriegt ja nur der sender die eigene nachricht zurück.

mit

Code: Alles auswählen

If Client()<>ClientID
sollte es gehen

edit: und mir ist aufgefallen wenn man den buffer nicht vor jedem empfang leert, dann überschneiden sich lange alte nachrichten mit kürzeren neuen.
ahjo und getrennte clienten aus der liste löschen nicht vergessen :)

mfG
Tobi