Seite 1 von 4

Netzwerk buffergröße

Verfasst: 31.03.2006 18:46
von myself
hi,
Wie bekomme ich die anzahl der durch readnetworkdata einzulesenden bytes?

Verfasst: 31.03.2006 20:08
von Icke
Auszug aus der Hilfe:
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenBuffer, Länge)
Die Daten werden in den angegebenen Speicherbereich '*DatenBuffer' gelesen.
'Ergebnis' gibt die Anzahl an bereits gelesenen Bytes an. Ist 'Ergebnis' gleich 'Länge', dann sind noch mehr Daten einzulesen.

Verfasst: 31.03.2006 20:15
von MVXA
Ist soweit ich weiß eine Limitierung der WinAPIs....

Verfasst: 01.04.2006 12:29
von myself
Also sollte ich so in der art empfangen?

Code: Alles auswählen

  i=0
  While  ReceiveNetworkData(id,get+i,1) = 1
    i=i+1
  Wend

Verfasst: 01.04.2006 13:09
von myself
Auf der client seite gibt das bei mir fehler.. kann mir mal jemand ein beispiel geben wie man nur so viel daten sendet wie auch wirklich gebraucht werden? ich mach das grad auf ne dumme methode bei der zuerst eine long gesendet wird in dem steht wie groß der darauffolgende buffer ist

Verfasst: 01.04.2006 22:30
von myself
Hat den noch niemand sowas geschrieben?!

Verfasst: 02.04.2006 03:47
von Toshy
Hallo.
Redest du von EMPFANGEN oder SENDEN. Beim senden muß du doch selber wissen wieviel du senden willst.
Zum EMPFANG solltest du folgendes wissen, so zum Verständnis.
Es gibt je "ClientNr." EINEN Buffer der mit den Daten die ankommen gefüllt wird, kommen neue Daten an wird dieser Buffer um die Daten erweitert (solange es der "SystemBuffer" zuläßt).
Es kann also sein, das du zwei oder dreimal schnell hintereinander was sendest, die Daten aber zusammen an der Gegenstelle ankommen und auf einmal ausgelesen werden. Das trennen muß du immer selbst übernehmen.
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenBuffer, Länge)
willst du jetzt alle Daten die angekommen sind auslesen und in einen eigenen Speicher einlesen (das ist das was du wohl meinst), dann geht das so (ist aber ungetestet, da hier auf dem Rechner kein PB läuft.)

Code: Alles auswählen

BufferSize = 10 ; nur zum test 10,sollte größer sein
*DatenBuffer = allocatememory(BufferSize) 
MemLen.l = 0
repeat
BuffLen = ReceiveNetworkData(ConnectionID, *DatenBuffer+MemLen, BufferSize)
if BuffLen > 0
MemLen = MemLen + BuffLen
*DatenBuffer = Reallocatememory(*DatenBuffer,MemLen+BufferSize)
endif
until BuffLen <= 0

In dem Speicher mit der ID *DatenBuffer stehen alle Daten, MemLen ist der Länge der Daten im Speicher.
Man sollte den Code natürlich noch verbessern, also ReAlloc nur nutzen wenn noch daten anliegen, aber es geht auch sol.
Falls es nicht alle Daten ausgelesen werden, dann habe ich bei "until" die Zeichen falsch gesetzt. bei Until mache ich öfter mal was falsch, hehe.
Ach bevor ich es vergesse.
"*DatenBuffer" ist NICHT der Buffer aus dem AUSGELESEN wird, das ist der Speicher in den DU die Daten reinhaben willst. Den Speicher mußt du dir erst erstellen. entweder mit AllocateMemory oder einen leerstring (das solltest du aber erstmal lassen).
"Länge" ist die Maximale länge die ausgelesen und in DEINEN Speicher reinkkopiert wird. Das dient dazu, das in den Speicher nicht mehr kopiert wird, als Platz da ist.



Toshy

Verfasst: 02.04.2006 17:53
von myself
Es kann also sein, das du zwei oder dreimal schnell hintereinander was sendest, die Daten aber zusammen an der Gegenstelle ankommen und auf einmal ausgelesen werden. Das trennen muß du immer selbst übernehmen
genau das problem habe ich jetzt, ich habs getestet, bei mir am pc, da kommt jetzt immer zu wenig an, wenn ich aber ein delay (10) bei jedem senden mache kommts richtig an, soweit so gut, ich habs aber dan übers internet getestet und da hat nichtmal delay was genützt es kam immer zu wenig an.. wie kann ich das noch trennen ausser durch pausen? wenns geht so das ich nicht alles komplett umschreiben muss

Verfasst: 03.04.2006 04:04
von Toshy
Also mich wundert das es mit einem delay beim SENDEN hilft, beim Empfangen hätte ich es noch verstanden. Aber mit einer Wartezeit ist dir nicht geholfen, da man nie genau weiß wie lange es dauer. zwar geht es über das internet meißt auch recht schnell, kann aber schon mal etliche Sekunden dauern oder mehr. Hängt von vielem ab.

Wenn du es sicher machen willst, so bleibt dir nur das was man immer wieder hört, ein eigenes Protokoll bzw. mach es vom Zustand der Verbindung abhängig. Aber genau das erstellen von solchen Routinen ist ja das komplizierte, nicht das senden und empfangen an sich. Für einfache Datenübertragungen würde ich entweder ein Steuerzeichen verwenden oder eine Längenangabe. Wenn du also beim Übertragen ein Bestimmtes Byte nichts brauchst (z.B. das Null-Bate), dann kann man die schleife so lange durchlaufen lassen, bis ein Nullbyte angekommen ist. Oder man Übergibt als erste(s) Zeichen die Länge der folgenden Daten und die Routine wartet so lange bis die Daten da sind.

Ich bastele und verwerfe seit einigen Monaten mein Protokoll immer wieder, hehe.

Am besten mache es mit der Übergabe der noch folgenden Daten, mußt dich nur entscheiden ob du ein Byte,Word oder Long nimmst. Und natürlich nicht vergessen ein Timeout einzubauen. Das aber wiederrum andere Probleme auslösen wird. *grins*

relativ sicher ist die ÜBermittlung mit der Angabe der folgenden Daten und einer Timeoutcontrolle im Eingangspeicher. Da dann aber eventl. Daten später noch nachkommen ist beim erneuten abfragen nicht mehr möglich zu erkennen ob dies alte Daten sind oder die Längenangabe für neue Daten. Das kann man umgehen, indem der "Empfänger/Server" dem Clienten erst eine Meldung zurücksendet, das er neue Daten senden darf.

Machst du das gerade um einfach mal die Networkfunktionen zu testen oder hast du schon ein bestimmtes Programm geplant. Je nachdem muß man sich überlegen was man macht.

Eine ganz sichere und Leistungsfähige routine beschäftig mich schon seit monaten und ich frage mich hier selbst im Forum schon dumm und dämlich ;-) Wenn die User "Toshy" lesen und den Begriff "Network", dann verstecken sie sich bestimmt schon *grins*

Gruß
Toshy

Verfasst: 03.04.2006 04:23
von MVXA
Was ihr hier zusammen schreibt sieht hoch interessant aus :lol:.

@myself
Das von dir beobachtete Verhalten kann ich mir nur vorstellen, wenn
du in deinem Source mehrere SendData Befehle nutzt um ein einziges
Paket zu schnürren. Wenn ich falsch liege, berichtige mich. Du solltest
vorher alles in einem Speicherberei zusammen fassen und den schicken.

@Toshy
Add mich mal in ICQ, ich könnte dir unterumständen helfen...