Schnellerer Datenaustausch



  • Hallo.
    Ich hab jetzt ein Server programm und einen Client.
    Jetzt schickt der Client den Server Daten und der Server verteilt diese Daten an jedem Client. (er wartet vorher bis alle Clients geschickt haben)

    So wollte ich die schnelle aktualisierung in einem Spiel machen. aber ich hab festgestellt, das die übertragung sehr langsam ist. (Stockt dann im Spiel)
    Ich hab nur die befehle send und recv benutzt... geht das aber anders? So das das schneller ist?

    lg Michael



  • wenn du TCP nimmst, kann ich dir die option TCP_NODELAY empfehlen.



  • mhm.... ich hab das jetzt nicht probiert mit dem befehl vorweg, aber wie ist das eigentlich bei großen programmen aufgebaut (in Schooter zb?) ?



  • "er wartet vorher bis alle Clients geschickt haben"

    😕

    Du meinst also, wenn zB. 5 Clients zum Masterserver verbunden sind, wartet der Server erstmal bis alle 5 Clients zB. ihre neue Position gesendet haben, und dann erst verteilt er die Info?
    Kein Wunder dass es dann stockt, wenn zB. ein Client lagt oder sonstwas.

    🙄



  • Shooter verwenden UDP, TCP ist viel zu lahm für zB. Positionsdaten.
    Außerdem musst du sofort handeln, wenn ein Client Daten schickt; es sofort an alle anderen Clienten weiterleiten (Socket selection, threads). Bin aber selbst nooby.



  • normalerweise macht der Server für jeden Cleint einen thread auf, der sich exclusiv um diesen Client kümmert



  • Eine schnelle und sichere Kommunnikation zwischen Server und Clients erreicht man auch mit SendMessage und benutzerdefinerten Message-IDs. Hierfür braucht man die beteilgten Fenster-Handles. Server und Clients erhalten die Nachrichten parallel und können selbst entscheiden, was und wann sie damit etwas anfangen wollen.



  • SendMessage() geht vielleicht über LAN (kA), aber doch nicht übers Internet? @CaPGeti sprach von einem Spiel... 😉



  • vlad_tepesch schrieb:

    normalerweise macht der Server für jeden Cleint einen thread auf, der sich exclusiv um diesen Client kümmert

    kwatsch lol



  • berniebutt schrieb:

    Eine schnelle und sichere Kommunnikation zwischen Server und Clients erreicht man auch mit SendMessage und benutzerdefinerten Message-IDs. Hierfür braucht man die beteilgten Fenster-Handles. Server und Clients erhalten die Nachrichten parallel und können selbst entscheiden, was und wann sie damit etwas anfangen wollen.

    du mußt subtiler trollen



  • Hey.... Danke für eure Antworten 🙂
    Das Problem ist, das ich kein select verwende (Ich versteh das einfach nicht).
    Und wenn jetzt ein client seine daten an den server schickt, dann soll ja am besten der server die daten an alle anderen clients schicken. Dann sendet zum beispiel client 2 seine daten. und der server verschickt wieder diese daten an jedem client.
    Dann hätt ich aber bei 5 clients ein send (zum schicken der daten an den server) und 4 recv ( für das empfangen der anderen spielerdaten). Man müsste es so machen, das der Client auf jeden eingang (das empfangen der Daten) entsprechend reagiert und verarbeitet (ausgabe, berechungen, etc).... Geht das mit select oder ist das für was anderes da?

    Das mit den Threads find ich ne tolle idee, leider kann ich mir nicht vorstellen wie ich das hinbekommen soll, das diese mit dem Server kommunizieren, also wenn er daten bekommt. Es gänge mit globalen variablen, aber diese wollt ich vermeiden.

    Nun, ich werde mal UDP, bzw sendMessage() angucken. Kennt jemand ein paar gute Tuts, die leicht verständlich sind?

    lg Michael



  • Vergiss SendMessage...

    Da:
    http://www.c-worker.ch/winsock/index.php
    http://www.c-worker.ch/tuts/select.php

    Gefällt mir aber nicht, da C-Frickel-Stil.

    Hab select nie benutzt, aber soweit ich weiß ist es das was du willst. Da hilft nur einarbeiten. Mach halt zwei Test-Konsolenapps und teste rum bis es funktioniert...



  • Also ich hab das mit den Sockets asynchron gelöst und das geht mit select blitzeschnell.

    Ich habe das gerade in der letzten Woche im LAN getestet. Ich habe die Zeit nicht messen können, aber nach einem Mausklick auf Rechner A, hat Rechner B einen Sound ausgegeben. Der Zeitverzug ist nicht wirklich wahrnehmbar und liegt wahrscheinlich daran, das mein PGM noch was anderes macht bis der Sound ausgegeben wird.



  • Mit select() kannst du eine Liste von Sockets ("set of sockets") auf Lesbarkeit und/oder Schreibarkeit und/oder Fehler prüfen lassen.
    Zusätzlich kann ein timeout angegeben werden.

    Wenn ein Socket als lesbar gilt heisst das: Es sind Daten angekommen und man kann recv() aufrufen ohne dass recv() blockiert (oder bei listen-sockets: Es kann accept() ohne blockieren aufgerufen werden)

    Prüft man mit select() auf Lesbarkeit, dann kehrt select() zurück sobald ein oder mehrere Sockets in der Liste 'lesbar' geworden sind - oder wenn der timeout-Wert erreicht wurde.

    Mit select() kann man quasi prüfen ob bei einem Socket Daten angekommen sind ohne recv()/recvfrom() aufrufen zu müssen, welches blockiert wenn keine Daten empfangen wurden.

    Recht interessant ist da auch:
    http://www.zotteljedi.de/doc/socket-tipps/select_ganz_genau.html

    Windows bietet Windows auch noch WSAAsyncSelect(): Es verschickt dann eine Nachricht ans Fenster wenn man bei nem Socket was lesen kann



  • Windows bietet Windows auch noch WSAAsyncSelect(): Es verschickt dann eine Nachricht ans Fenster wenn man bei nem Socket was lesen kann

    Der Vollständigkeit halber sollten hier dann noch IO Completion Ports erwähnt werden, nen? 🙂



  • select und WSAAsyncSelect sind doch einfach nur obsolete.



  • Why?



  • Hey cool danke für eure Hilfe 🙂

    Jetzt versteh ich den Befehl endlich auch ^^
    Hab sogar bei den links ein gutes beispiel gefunden, damit ich threads umgehen kann.
    mhm. Jetzt muss ich das nur noch mit der größe hinbekommen....

    thx at @.

    lg Micha


Log in to reply