Netzwerkpakete verschwinden [Erledigt]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Netzwerkpakete verschwinden [Erledigt]

Beitrag von Kooky »

Hiho,

ich bin's schon wieder. Ich hatte ja schonmal das Problem, dass mein "netzwerkprogramm" (erstmal die Engine nur für die Netzwerkkommunikation)
nicht richtig lief. Da hieß es, dass es an den Threads läge.

Es ist wie verflucht. Also ich habs jetzt neu geschrieben. Komplett ohne Threads.
Aber ich habe das Problem, dass das Programm total unzuverlässig und
unberechenbar läuft.
Also manchmal läufts perfekt und manchmal nicht und manchmal so hälfte hälfte.
Also bei meinem DesktopPC lokal ( connected auf 127.0.0.1 ) läufts einwandfrei. Auf meinen Laptop lokal werden so 100 Packets verschickt, dann fehlen 30 und dann die nächsten 100.

Wenn ich auf meinem Laptop den Server starte und mit meinem DesktopPC connecte gehts auch perfekt. Wenn ich auf meinem DesktopPC den Server starte und mit meinem Laptop connecte fehlen wieder ein haufen Pakete und ich habe keine Ahnung warum.

Vom prinzip her funktioniert mein Programm so:
Bei den Paketen ist der erste byte eine Checksumme, die mit jedem Paket um 1 erhöht wird ( dient zum ermitteln, ob auch alle Pakete ankommen)
Der zweite Byte ist der Befehl bzw. die Art des Paketes. Also wie das Paket
weiter Aufgebaut ist / bzw. was es beinhaltet. (z.B. im Codeexample bedeutet die 1 eine Nachricht ...also der Inhalt des Pakets ist der Nachrichtentext, den der andere bekommen soll)
Danach kommt ein Long. Dieser gibt auskunft darüber, wie lang der Paketinhalt ist. Also wenn der Text z.b. der Nachricht 6 zeichen lang ist, dann steht dort eine 7.
Dann kommt der eigentlich Inhalt des Paketes, also der worüber, der vorherige Long auskunft über die Länge gibt.
Der Buffer für die Packets ist fest.
Nochmal zusammengefasst.
1 Byte => Checksumme
1 Byte => Befehlt
4 Bytes => Länge
[Länge] Bytes => Inhalt

Die Procedure Output könnt ihr ruhig ignorieren...dort steht nichts drin, was mit dem Netzwerk zu tun hat.

Die Funktionsweise des Programms selber:
Es gibt eine Liste, wo jedes Element ein Paket ist, welches gesendet werden soll. NetSend()
Es gibt eine Liste, wo jedes Element ein Paket ist, welches empfangen wurde. NetRece()
Der Befehl "DoNetworkStuff()" erledigt alle Netzwerkdinge.
Also der sendet alle offenen Pakete aus der Sendeliste und holt
1 Paket ab. Der Rest sollte sich von selbst erklären.
Also wenn etwas unklar ist, dann fragt bitte.

Wäre nett, wenn ihr einfach testen könntet ob es bei euch funktioniert:
Einfach server starten und dann client starten (beide senden permanent nachrichten zum anderen). Wenn ihr den Debugger anschaltet, und dort "Netzwerkfehler" debuggt wird, bedeutet das, dass mindestens ein Paket gefehlt hat.
Also einfach testen ob der Code bei euch geht, damit ich weis ob es ein
Problem von meinem Laptop ist, oder allgemein ein Problem ist.
Bei mir trat das Problem "Netzwerkfehler" ziemlich schnell auf...also so ca. nach 200~300 Paketen.

Code

Vielen Dank fürs Testen

mfg. Kooky
Zuletzt geändert von Kooky am 24.12.2005 14:50, insgesamt 1-mal geändert.
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

Das hatten wir doch schon ? :roll:
http://forums.purebasic.com/german/viewtopic.php?t=6115

Ich hatte Dir dort empfohlen, die Rückgabewerte von
ReceiveNetworkData() und SendNetworkData() auszulesen
und zu berücksichtigen .....

In deinem gegenständlichen Code ist das aber nicht berücksichtigt /:->

So wird es leider nie zuverlässig funktionieren.

Cu Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

und was soll ich dann mit den rückgabewert machen?
ich hab da leider keinen praktischen sinn gesehen.
Ich schau es mir nochmal an :wink:
Kooky
Beiträge: 47
Registriert: 18.09.2004 16:13
Wohnort: München
Kontaktdaten:

Beitrag von Kooky »

shit
du hast recht
Sorry , dass ich deine Tipp "ignoriert" habe :cry:
Besten Dank :allright: .
Antworten