Verständnisfrage: IP Pakete empfangen.

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Markus Jacobs.

    Verständnisfrage: IP Pakete empfangen.

    Halöle,

    ich habe eine allgemeine Verständnisfrage.
    Zuerstmal mein Vorhaben: Eigentlich bin ich schon recht gut bewachsen im Thema Netzwerkprogrammierung, soweit, das ich weiß wie ich Pakete empfangen und versenden und auf der jeweiligen Seite verarbeiten kann.

    Nun zu meiner Frage: Der offizielle Game-login Server von dem Spiel Ragnarok steht (soweit ich weiß) in Kanada, was ja nicht so nah ist, bedeutet die Pakete hamm nen weiten Weg und könnten Zeitversetzt ankommen.
    Nunja, eben hatte ich dieses Problem: Prinzipiell wusste ich jetzt bei dem Paket das ich erhalte das es 79 Bytes groß ist. Allerdings habe ich mit meinem C# Programm mit nem Socket drauf verbunden und dort war die Paketgröße nur 47 bytes. Wenn ich vor die Receive Funktion des Sockets nen Thread.Sleep(1000) gesetzt habe kamen die 79 bytes an. Nungut, hab ich mir kurz ne schleife gemacht die wartet bis im stream 79 bytes drinne sind hat auch supii funktioniert.

    Allerdings kann die Größe des Packets doch variieren, wie kann ich es also sauber lösen das der Socket nun automatisch wartet bis wirklich nichts mehr ankommt ohne das Thread.Sleep.
    Geht das irgendwie? Ich meine das Spiel wartet ja auch...

    Also ich mache das so:

    Socket.Receive(buffer, 0, Socket.Available);
    Das Socket.Available gibt die Anzahl an bytes an die im stream vorhanden sind.
    Wenn nun aber erst 47 bytes drinne sind liest er nur 47 bytes.. anstatt die 79... wie kann ich das verhindern?

    Danke im Voraus.
    Das Spiel macht es dann so nehm ich an?
    Achtung Pseudocode:

    C#-Quellcode

    1. Do
    2. {
    3. ReceivedBytes = Socket.Receive(somebuffer, 0, Socket.Available);
    4. } While (ReceivedBytes != ErwartetesPacket.Length)


    Irgenwie so nehm ich an?
    Zumindest nach diesem Prinzip. Du musst halt ein Protokoll schreiben, welches genau weiß wie viel kommt und was da überhaupt ankommt.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    schockerjo schrieb:

    Kannst ja gucke, ob am Anfang des Pakets irgendwo eine Größe oder der gleichen zu finden ist.

    MfG


    Jo, ne leider nur bei manchen Paketen...

    Also was ich vorhabe ist ein Proxy für´n altes Game namens Ragnarok Online.
    Bedeutet: Der Spielclient verbindet nur indirekt zum offiziellen server über einen Proxy (den ich programmiere). D.h. die Anfragen vom Client werden an mich (den Proxy gesendet) der Proxy emuliert dann den eigentlichen Client und verbindet sich mit dem offiziiellen Server. Das bringt mir den Vorteil das ich die Pakete abändern kann.

    Es funktioniert auch so wie es soll jetzt.. halt nur das ich es so gelöst habe mit dem Thread.Sleep... was ich sehr unsauber finde... Der Vorteil dabei ist auch, dass ich nich jedes Paket einzeln verarbeiten muss denn wenn ich das machen würde könnte ich ja wissen wie groß jedes Paket ist... Da ich die Pakete aber einfach nur annehme, ggf. modifiziere, und dann weiter sende geht das nicht.

    Naja egal es funktioniert jetzt.