Seite 2 von 4

Verfasst: 03.04.2006 07:26
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.

Verfasst: 03.04.2006 14:04
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

Verfasst: 03.04.2006 15:24
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

Verfasst: 03.04.2006 15:53
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

Verfasst: 03.04.2006 15:59
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?

Verfasst: 03.04.2006 16:27
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.

Verfasst: 03.04.2006 16:37
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:

Verfasst: 03.04.2006 16:51
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:

Verfasst: 03.04.2006 16:54
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:

Verfasst: 03.04.2006 16:56
von AND51
Tja, jedenfalls ist mein Puffer 64 K groß und dazu sag ich nur
qed :lol: 8) *bäääääh* :wink: :allright: