Netzwerk buffergröße
Netzwerk buffergröße
hi,
Wie bekomme ich die anzahl der durch readnetworkdata einzulesenden bytes?
Wie bekomme ich die anzahl der durch readnetworkdata einzulesenden bytes?
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
-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
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.
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
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.
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.)Ergebnis = ReceiveNetworkData(ConnectionID, *DatenBuffer, Länge)
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.
"*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
1. Win10
PB6.1
PB6.1
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 mussEs 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
-
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
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
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

Gruß
Toshy
1. Win10
PB6.1
PB6.1
Was ihr hier zusammen schreibt sieht hoch interessant aus
.
@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...

@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...