SDL_Net Server und SDLNet_TCP_Send



  • Hi an Alle,
    ich hab hier so ein kleines Problem. Ich schreib einen Client und einen Server für ein kleines Spiel mit der SDL_Net. Jetzt muss ich natürlich auch Daten an die Clients senden können. Allerdings steht folgendes im Kommentar zur Funktion SDLNet_TCP_Send.

    This routine is not used for server sockets.

    Arber wie soll ich denn sonst Daten an die Clients senden 😕

    Wäre nett, wenn mir jemand helfen könnte. Ne empfehlung für ne gute C++ Netzwerklibrary würde es auch tun.



  • ProgChild schrieb:

    Arber wie soll ich denn sonst Daten an die Clients senden 😕

    Du musst ein accept(SDLNet_TCP_Accept()) auf den Serversocket ausführen. Dadurch erhält man einen neuen Socket, über den dann die Kommunikation mit dem verbundenen Socket auf Clientseite abläuft. Der Serversocket kommuniziert nie mit, sondern spuckt für jede Verbindung so einen neuen Socket aus.
    Dieses Verhalten ist zunächst unerwartet, dann aber auf den zweiten Blick sinnvoll und somit bei Sockets allgemein üblich.



  • Achso... Jetzt verstehe ich, was damit gemeint ist. Das mit dem accept hatte ich schon verstanden, nur dachte ich, dass sich das auf die Sockets bezieht, die vom accept ausgespuckt werden, aber da lag ich wohl falsch...

    Das Problem, das ich jetzt habe, ist, dass SDLNet_TCP_Send den Funktionsaufruf so lange anhält, bis die Daten gesendet wurden. Das ist ein bisschen doof, da wenn ich einen Client mit einer schnellen und einen mit einer langsamen Verbindung habe, dann wird der schnelle durch den langsamen ausgebremst, weil der Server erst die Daten an den langsamen Client schaufeln muss. Kann man die SDLNet Sockets nicht irgendwie auf Non-Blocking stellen, oder muss ich alles mit Threads machen. Für jede Verbindung 2 Thread einzurichten ist ein bisschen viel.

    Ich mache zur Zeit für jede Verbindung, beim Server zwei Threads auf...



  • Warum denn 2 Threads pro Verbindung??



  • hmmmmmmmm schrieb:

    Warum denn 2 Threads pro Verbindung??

    Einen zum Senden einen zum Empfangen. Da die recv Funktion von SDL_Net blocking ist, ist ein Thread die ganze zeit damit beschäftigt, zu lauschen...



  • aber normalerweise macht man doch das senden und empfangen immer abwechselnd 🙂

    ok aber vielleicht ist es bei spielen anders 🙂

    hat SDL vielleicht sowas wie select oder poll?



  • ah hier ist es: http://jcatki.no-ip.org/SDL_net/SDL_net_frame.html

    aber bei wenigen clients kannste ruhig threads nehmen.



  • hmmmmmmmm schrieb:

    aber normalerweise macht man doch das senden und empfangen immer abwechselnd 🙂

    ok aber vielleicht ist es bei spielen anders 🙂

    Jeder Client kann zu jeder Zeit, ein Event auslösen, dass an alle Clients sofort gesendet werden muss. Da ist es nicht gerade einfach, immer Senden und lesen abwechselnd zu machen, da nicht feststeht, ob ein Event auf dem lokalen Client oder auf irgend einem anderen statt findet.

    hmmmmmmmm schrieb:

    hat SDL vielleicht sowas wie select oder poll?

    Etwas ähnliches wie Select. Das funktioniert aber nicht wirklich, weil SDLNet_TCP_Send blockiert.

    hmmmmmmmmmm schrieb:

    ah hier ist es: http://jcatki.no-ip.org/SDL_net/SDL_net_frame.html

    aber bei wenigen clients kannste ruhig threads nehmen.

    Den Link kannte ich schon. Da steht genau das drinn, was mein Problem ist. SDLNet_TCP_Send blockiert.

    Das war jetzt leider nicht wirklich hilfreich...

    Ich finde das mit den Threads nicht wirklich eine gute lösung, da der Overhead warscheinlich zu groß wird, da ich den Server für relativ viele Clients auslegen möchte.

    Also hat jemand eine Idee, wie ich folgendes hinbekomme:
    Ich möchte, dass der Server in der lage ist, jederzeit ein Event, dass an einem Client auftritt, allen anderen zu melden. Das sollte mit möglichst vielen Clients funktionieren.
    Wenn ich mit normalen Sockets arbeiten würde, dann würde ich die auf Nonblocking stellen und select benutzten, allerdings scheint das mit der SDL nicht zu klappen. *Puh* ich hoffe jetzt versteht ihr das Problem.

    Ich hatte bis jetzt gedacht, dass SDL_Net ne gute Idee wäre, weil die halt so schön Plattformunabhängig ist. Also, wenn jemand ne Idee hat, wie ich das mit der SDL_Net hinbekomme, dann sagt es mir. Falls ich etwas in der Dokumentation übersehen habe, dann weist mich bitte darauf hin, allerdings habe ich die schon mehrere male durchgelesen 😞

    Vermutlich läuft das darauf hinaus, dass ich wieder mit Sockets programmieren muss...



  • Etwas ähnliches wie Select. Das funktioniert aber nicht wirklich, weil SDLNet_TCP_Send blockiert.

    lol das ist ja wirklich dämlich. dann weise den entwickler doch mal darauf hin. 🤡

    GNU Common C++ könnte noch hilfreich sein.
    http://www.gnu.org/software/commoncpp/



  • nonblocker schrieb:

    GNU Common C++ könnte noch hilfreich sein.
    http://www.gnu.org/software/commoncpp/

    Danke für den Link. Ich würde nur gerne Libraries nehmen, die nicht unter der GPL stehen, da ich noch nicht weis, unter welcher Lizens ich das veröffentliche. Da wäre die LGPL besser...



  • Schau dir mal die clanlib an. (www.clanlib.org).





  • Danke für die Links 🙂

    Mein Server sollte mit so vielen Clients wie möglich zurecht kommen. Ich denke da so an 30-50 Clients, wenn das nicht utopisch ist. Sind die beiden Libraries dafür gleichermaßen geeignet?


Anmelden zum Antworten