AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Chat Server empfängt immer nur einmal
Thema durchsuchen
Ansicht
Themen-Optionen

Chat Server empfängt immer nur einmal

Ein Thema von Luckie · begonnen am 18. Mär 2005 · letzter Beitrag vom 19. Mär 2005
 
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#7

Re: Chat Server empfängt immer nur einmal

  Alt 19. Mär 2005, 09:13
Zitat von Luckie:
Zitat von Basilikum:
vermutlich wirst du nicht um den Non-Blocking-Mode herumkommen....
Ich hatte gerade, als ich du das über blocking und non-blocking geschrieben hast, etwas im Internet gestöbert. da wurde allgemein gesagt, dass man non-blocking sockets nicht verwenden sollte.
das würde mich etwas erstaunen, eine solche Pauschal-Aussage... vermutlich unter bestimmten Bedingungen, oder ?

Zitat von Luckie:
Zitat:
und für die Kommunikation zwischen den Client-Threads wird irgend eine Art von Thread-Safen Queue benötigt...
Ich habe mir das so überlegt: Die Nachricht wird in einen gloablen String geschrieben. Jedesmal, wenn was ankommt, feuert der ClientThread einen Event und der ServerThread, der die ClientThreads erstellt, schickt die Nachricht dann Reih um an alle Clients. Das heißt, ich bräuchte zusätzlich noch ein Array mit den SocketASdressen der Clients. Oder könnte man auch auf dem Port einen Broadcast schicken? Wenn ja, wie geht das?
das meinte ich mit den concurrent Socket-Operationen: einerseite würde ja der Client-Thread im recv warten, und der Server versucht gleichzeitig noch per send (auf dem selben Socket) Daten abzusetzen.
"Port Broadcasts" gibts nicht.

als Quit'n'Dirty Variante könntest du die Windows-Message-Queue missbrauchen (PostThreadMessage, etc). So must du nicht selber eine thread-safe queue implementieren.
und innerhalb der Client-Threads mit select() für einige 100ms auf Netzwerk-Daten warten, dann kurz die Window-Message-Queue prüfen, danach wieder auf Netzwerk-Daten warten. Du brauchst dann lediglich ein Array auf alle Thread-IDs, die allerdings wieder thread-safe sein muss....

Zitat von Luckie:
Zitat:
auf Dinge wie concurrent Socket-Operationen mehrere Threads auf dem selben Socket würde ich mich nicht einlassen... das kracht über kurz oder lang...
Kannst du das etwas näher ausführen? das sind so meine ersten Schritte in der Netzwerkprogrammierung.
siehe oben

ein grundlegend anderer Ansatz wäre, alle Sockets mit einem einzigen Thread zu bedienen:
- Socket auf non-blocking schalten
- mittels select() auf ein Ereignis (eingehende Verbindung oder Daten vorhanden) eines der vorhandenen Sockets (Server-/Client-Sockets) warten
- entsprechend reagieren (Connection akzepiteren, Daten lesen und weitersenden)

würde ich jedoch nicht verwenden:
- keine saubere Kapselung der Clients gegeneinander
- riesiger Thread-Code, unübersichtlich, fehleranfällig
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz