Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Nein. Die Funktion wartet, bis etwas auf dem Socket ankommt oder bis der Timeout erreicht ist, je nachdem, was früher eintritt.Naja sie bekommt ein SocketSet und einen Timeout. Nach dem Timeout gibt sie an, ob Aktivität auf dem Socket ist oder nicht. Will ich Lesen und dabei warten bis Daten da sind, verwende ich direkt SDLNet_TCP_Recv; lagere ich die Überprüfung vor, lese ich schließlich auch mit der Funktion, nur blockiert zwingend sie nicht weil ja prinzipiell Aktivität vorliegt.
Nein. Die Funktion wartet, bis etwas auf dem Socket ankommt oder bis der Timeout erreicht ist, je nachdem, was früher eintritt.
Quellcode |
|
1 2 3 4 5 6 7 8 |
solange server online: wenn aktivität auf listener socket: nimm neuen client an für jeden worker socket: solange aktivität: lies event gib event an in-queue delay |
Quellcode |
|
1 2 3 4 5 6 7 |
solange server online: nimm event von out-queue solange event leer: delay nimm event von out-queue ermittle ziel des events (worker) sende event an worker |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
solange client online // senden bis nichts mehr zu senden solange trve: nimm event von out-queue wenn event leer: break sende event an server // empfangen bis nichts mehr zu empfangen solange aktivität auf socket: empfange event gib event an in-queue delay |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
1) Wieso sollte der Accept-Thread irgendwas anderes machen als Accept? Receive-Thread für Server über select() oder das SDL-Äquivalent.
2) Server Send-Thread sieht ok aus - außer vielleicht Nagle-Ack.
3) Client Send/Receive-Thread ist nicht gut. Blockiert sich gegenseitig. Receive und Send sollten unabhängig voneinander sein. Nicht pro Client einen Thread, sondern einen pro Aufgabe (Aufgabe = Send ODER Receive).
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Ich wiederhole: Ein Accept gehört meiner Meinung nach nicht in einen Receive-Loop, denn Receive selbst sollte wie select() arbeiten, die entsprechende SDL-Funktion wurde Dir ja schon genannt. Wenn man das aber so macht, müsste ein neuer Client so lange warten, bis ein anderer Daten schickt. Nicht mit einer Funktion wie select() zu arbeiten heißt Pollen, weil select() blockt und das sogar auf eine sehr sinnvolle Art und Weise. Polling ist nie gut aus diversen Gründen.1) Wieso sollte der Accept-Thread irgendwas anderes machen als Accept? Receive-Thread für Server über select() oder das SDL-Äquivalent.
Ich arbeite komplett mit den SDL-Funktionen. Was meinst du mit "Wieso sollte der Accept-Thread irgendwas anderes machen als Accept?"? Meine Idee war, das Accepten (ist non-blocking) mit in den Receive-Loop einzubauen. So oft kommen keine neuen Clients dazu - von daher würde ich ggf. auf einen extra Accept-Thread verzichten wollen.
Delayed Ack und Nagle-Algorithm. Findet sich im Netz, kann ziemlichen Ärger bauen.Was meinst du damit genau?
Ja. Sinnvoller als Sleeps und Wait-Cycles wären hier aber Notifications/Events. Da es aber nur ein Client ist, sind Wait-Cycles oft eine gängige Lösung.Also ein Send-Thread und ein Recv-Thread am Client?
simbad
unregistriert
Ich wiederhole: Ein Accept gehört meiner Meinung nach nicht in einen Receive-Loop, denn Receive selbst sollte wie select() arbeiten, die entsprechende SDL-Funktion wurde Dir ja schon genannt. Wenn man das aber so macht, müsste ein neuer Client so lange warten, bis ein anderer Daten schickt. Nicht mit einer Funktion wie select() zu arbeiten heißt Pollen, weil select() blockt und das sogar auf eine sehr sinnvolle Art und Weise. Polling ist nie gut aus diversen Gründen.
Delayed Ack und Nagle-Algorithm. Findet sich im Netz, kann ziemlichen Ärger bauen.
Ein listener erzeugt, wenn ich nicht ganz falsch liege ein Read-Event wenn eine neue Verbindung reinkommt.
Ich würde mir eher erstmal die Frage stellen, was der Server mit den empfangenen Daten eigentlich anstellen wird. Nehmen wir an, dass Senden und Empfangen gelöste Probleme sind, wie genau werden die Daten am Server verarbeitet?
Werbeanzeige