Netzwerk buffergröße
Ich hab das schon mal ausführlich beschrieben, hier nocheinmal
eine Zusammenfassung:
ReceiveNetworkData() liefert ein Ergebnis, nämlich die tatsächlich
in den Speicher gelesene Bytezahl *oder* einen Fehlerzustand,
dann ist das Ergebnis -1
Stimmt die erhaltene Bytezahl mit der erwarteten nicht überein,
muß die Abfrage in einer Schleife wiederholt werden, solange bis
die erwartete Bytezahl da ist. Fehlabfragen quittiert ReceiveNetworkData
mit -1.
Man benötigt also eine Schleife, die ReceiveNetworkdata solange
aufruft, bis die vereinbarte Zahl an Bytes da ist, jedoch auch das
Ergebnis -1 berücksichtigt. Hier kann man auch gleich eine
Fehlerbehandlung einbauen: erhält man n mal -1 hintereinander,
so wird die Schleife mit einem fehler verlassen.
Ist die zu erwartende Bytezahl dem Server nicht bekannt, muß sie
vorab in einem Header vom Client mitgeteilt werden. Der Header
sollte eine fixe vereinbarte Länge haben, sodaß er einfach ausgewertet
werden kann.
Hintergrund ist, daß naturgemäß jede Netzwerkübertragung Zeitverzögerungen beinhalten kann
und sich der Empfangsbuffer nur entsprechend füllt.
Sinnvollerweise stellt ReceiveNetworkData() erhaltene Daten bereits
unmittelbar zur Verfügung.
Ebenso sollte man SendNetworkData() auf den Rückgabewert (= gesendete Bytes)
abfragen, auch hier kann es dazu kommen, daß nicht alle zum Absenden
gedachten Daten auf einmal in den Sendespeicher geschrieben werden
können. Auch hier kann -1 ein Rückgabewert sein, wenn der Sendepuffer
z.B. schon voll ist und die Übertragung gestört / zu langsam ist.
Cu von Team100
eine Zusammenfassung:
ReceiveNetworkData() liefert ein Ergebnis, nämlich die tatsächlich
in den Speicher gelesene Bytezahl *oder* einen Fehlerzustand,
dann ist das Ergebnis -1
Stimmt die erhaltene Bytezahl mit der erwarteten nicht überein,
muß die Abfrage in einer Schleife wiederholt werden, solange bis
die erwartete Bytezahl da ist. Fehlabfragen quittiert ReceiveNetworkData
mit -1.
Man benötigt also eine Schleife, die ReceiveNetworkdata solange
aufruft, bis die vereinbarte Zahl an Bytes da ist, jedoch auch das
Ergebnis -1 berücksichtigt. Hier kann man auch gleich eine
Fehlerbehandlung einbauen: erhält man n mal -1 hintereinander,
so wird die Schleife mit einem fehler verlassen.
Ist die zu erwartende Bytezahl dem Server nicht bekannt, muß sie
vorab in einem Header vom Client mitgeteilt werden. Der Header
sollte eine fixe vereinbarte Länge haben, sodaß er einfach ausgewertet
werden kann.
Hintergrund ist, daß naturgemäß jede Netzwerkübertragung Zeitverzögerungen beinhalten kann
und sich der Empfangsbuffer nur entsprechend füllt.
Sinnvollerweise stellt ReceiveNetworkData() erhaltene Daten bereits
unmittelbar zur Verfügung.
Ebenso sollte man SendNetworkData() auf den Rückgabewert (= gesendete Bytes)
abfragen, auch hier kann es dazu kommen, daß nicht alle zum Absenden
gedachten Daten auf einmal in den Sendespeicher geschrieben werden
können. Auch hier kann -1 ein Rückgabewert sein, wenn der Sendepuffer
z.B. schon voll ist und die Übertragung gestört / zu langsam ist.
Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Hier hast du eine Routine zum korrekten Empfang
Hast du nun die zu sendenden Daten im Speicher, so kannst du diese
(bei kleinen Mengen sinnvoll) auf einmal übertragen. In jedem Falle
solltest du aber eine äquivalente Schleife wie die oben gezeigte
fürs Empfangen schreiben (und -1 und Teilsenden berücksichtigen)
Da du hier im Allgemein-Forum postest wird das ja kein Problem
sein.
Beachte, dass der Empfangscode hier oben 4 führende Byte (ein long)erwartet,
um die Größe des zu übermittelnden Buffers bekanntzugeben.
Du mußt also dem Sendespeicher die 4 Byte voran anfügen und
dann die Sendeschleife aktivieren.
Wenn du große Dateien zum Übertragen hast, dann muß diese
in Pakete geteilt werden. Dies geht einfach durch ReadData und
die entsprechende Größenangabe.
Sendest du Pakete, dann ist ein Handshaking von Vorteil, d.h. du
sendest nach Erhalt eines Paketes eine Bestätigung zurück,
um das nächste Paket zu erhalten usw..
Cu von Team100
Code: Alles auswählen
;Lies die Länge der folgenden Daten aus
result = ReceiveNetworkData(ClientID, @Size, 4)
If result = 4 And Size > 0
;Allokiere Speicher in dieser Größe
*MemBuffer = AllocateMemory(Size)
errorcounter = 0
ReceivedBytes = 0
Repeat
;Speicher die Anzahl der geladenen Bytes {noch zu laden}
result = ReceiveNetworkData(ClientID, *MemBuffer + ReceivedBytes, Size - ReceivedBytes)
If result = -1
delay(1)
errorcounter + 1
Else
ReceivedBytes + result
errorcounter = 0
Endif
Until ReceivedBytes = Size Or errorcounter > 6000 ; Abbruch nach 6 Sekunden
Endif
If Size > 0 And ReceivedBytes = Size
; transmission ok
Else
; not ok, timeout
Endif
(bei kleinen Mengen sinnvoll) auf einmal übertragen. In jedem Falle
solltest du aber eine äquivalente Schleife wie die oben gezeigte
fürs Empfangen schreiben (und -1 und Teilsenden berücksichtigen)
Da du hier im Allgemein-Forum postest wird das ja kein Problem
sein.

Beachte, dass der Empfangscode hier oben 4 führende Byte (ein long)erwartet,
um die Größe des zu übermittelnden Buffers bekanntzugeben.
Du mußt also dem Sendespeicher die 4 Byte voran anfügen und
dann die Sendeschleife aktivieren.
Wenn du große Dateien zum Übertragen hast, dann muß diese
in Pakete geteilt werden. Dies geht einfach durch ReadData und
die entsprechende Größenangabe.
Sendest du Pakete, dann ist ein Handshaking von Vorteil, d.h. du
sendest nach Erhalt eines Paketes eine Bestätigung zurück,
um das nächste Paket zu erhalten usw..
Cu von Team100
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
Mannoman, euer aller Empfangspuffer ist 64 K groß...
geht doch einfach mal mit rechts auf Arbeitsplatz, Eigenschaften und sucht den Gerätemanager bei dem reiter Hardware.
Dann sucht ihr bei Netzwerkadapter eure Netzwerkkarte, ich nehm mal die, die ich auch zum Netzen, für DSL und für's LAn brauch.
Klick mit rechts auf eure Netzwerkkarte, bei mir eine realtek, und dann auf Eigenschaften, dann den Reiter Erweitert.
Dort steht bei den Eigenschaften Empfpfangspuffergröße und siehe da! Dort ist standardmäßig 64 K eingetragen.
geht doch einfach mal mit rechts auf Arbeitsplatz, Eigenschaften und sucht den Gerätemanager bei dem reiter Hardware.
Dann sucht ihr bei Netzwerkadapter eure Netzwerkkarte, ich nehm mal die, die ich auch zum Netzen, für DSL und für's LAn brauch.
Klick mit rechts auf eure Netzwerkkarte, bei mir eine realtek, und dann auf Eigenschaften, dann den Reiter Erweitert.
Dort steht bei den Eigenschaften Empfpfangspuffergröße und siehe da! Dort ist standardmäßig 64 K eingetragen.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
man o man, bei mir nicht, will auch ne realtekAND51 hat geschrieben: Dort steht bei den Eigenschaften Empfpfangspuffergröße und siehe da! Dort ist standardmäßig 64 K eingetragen.

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Wenn du mir nicht glaubst, dann habe ich hier einen Screenshot im möglichst Platzsparenden GIF Format (PNG wär 55 Kb größer gewesen):

Glaubst du es jetzt?

Glaubst du es jetzt?

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
>> Glaubst du es jetzt?
ich glaube dir das es bei dir da steht, bei mir trotzdem nicht.
Werde mir also so eine Realtek kaufen müssen, damit ich auch
Bescheid weiß

ich glaube dir das es bei dir da steht, bei mir trotzdem nicht.
Werde mir also so eine Realtek kaufen müssen, damit ich auch
Bescheid weiß

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Tja, jedenfalls ist mein Puffer 64 K groß und dazu sag ich nur
qed
*bäääääh*

qed




PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End