Einzelnen Beitrag anzeigen

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