Netzwerk buffergröße

Für allgemeine Fragen zur Programmierung mit PureBasic.
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

ich schick nun immer einen word mit 2, der enthält die länge des nachfolgenden buffers, dan wird gewartet bis das 2. paket da ist und eingelesen so viel wies in der word stand, ist relativ sicher.
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

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
Kompliziert kann es jeder lösen, aber das wirklich Geniale ist einfach.....
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

Kann mir jemand verraten wie man dateien stückchenweise überträgt? ich hab schon alles versucht es funktioniert bei mir am pc immer pefekt übers internet kommt nie alles an! ich werd wahnsinnig hab shcon alles versucht
Team100
Beiträge: 104
Registriert: 13.09.2004 22:59

Beitrag von Team100 »

Hier hast du eine Routine zum korrekten Empfang

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
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. :wink:

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.....
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Beitrag von myself »

ich hab den fehler gefunden, vorher sendete ich immer pakete mit größe 9000 bytes, ich habs auf 100 bytes umgestellt und alles ging (wenn auch etwas langsamer), kannst sein das der empfangs/sendebuffer bei internetübertragungen kleiner ist?
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
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

Beitrag von ts-soft »

AND51 hat geschrieben: Dort steht bei den Eigenschaften Empfpfangspuffergröße und siehe da! Dort ist standardmäßig 64 K eingetragen.
man o man, bei mir nicht, will auch ne realtek :mrgreen:
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.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

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):
Bild

Glaubst du es jetzt? :twisted:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
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

Beitrag von ts-soft »

>> Glaubst du es jetzt? :twisted:
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ß :mrgreen:
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.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tja, jedenfalls ist mein Puffer 64 K groß und dazu sag ich nur
qed :lol: 8) *bäääääh* :wink: :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten