Serverprobleme

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Serverprobleme

Beitrag 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
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Beitrag 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....:(
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag 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!
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag von tranquil »

Jeder verbundene Client auf der Serverseite braucht mit 100% Sicherheit einen eigenen Buffer. Zumindest wenn es richtig funktionieren soll. :-)
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

Wenn mehrere Clients auf einen Server gleichzeitig Transaktionen durchführen sollen, dann ist für jeden Client ein eigener Serverthread notwendig!
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
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Beitrag 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?
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag 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
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Beitrag von captain third »

Danke :mrgreen: :mrgreen: :mrgreen:
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
Antworten