![]() |
AW: Ist der Server zu "schnell"?
Also mit den INdykomponenten funktioniert bei mir gar nichts...
also nochmal: Ich muss jetzt auslesen a) Wie groß wird die gesendete Information sein die an den Server geschickt wird b) wie groß ist der Datensatz den Server bereits empfangen hat! So... ich möchte jetzt gern erlernen wie das bei einem TServerSocket funktionieren würde, im INternet finde ich einfach keine vollständige Methoden und Eigenschaftenübersicht... Zumal ServerSocket.Socket hat ja die Methode recievelength, aber wieso gibts für Client/Server.Socket keinen Sendlength? Is doch völlig bescheuert... und wenn ich jetzt SizeOf(Info) bei nem recieve(Info,SizeOf(Info)) verarbeiten will, is das immer irgendwie nichts... Man wie mach ich das denn? Das kann doch nich so schwierig sein... Ich verstehe einfach nich wie ich den Buffer des servers auslesen soll! |
AW: Ist der Server zu "schnell"?
Zitat:
b) siehe ![]() HTH.. |
AW: Ist der Server zu "schnell"?
Zitat:
ich werde mir die Seite gleich mal anschauen und deinen Rat ausprobieren. Ich bedanke mich übrigens jetzt schonmal dass ihr mich bei meinem Problem so kräftig unterstützt =) |
AW: Ist der Server zu "schnell"?
Wenn der Client Daten an den Server sendet und erst die Länge der Nachricht verschicken soll, dann muss der Client doch wissen, wie groß die Nachricht ist, odda? ;)
|
AW: Ist der Server zu "schnell"?
Zitat:
Hätte ich meine Socket-Geschichten nicht in einer eigenen Bibliothek untergebracht und auch auf mitgelieferte Komponenten gebaut, würde ich dir hier ein dickes Beispiel posten können, aber das ist eben was komplett anderes, für 'außenstehende' kompliziert zu verstehen und eben auf mein eigenes Protokoll zugeschnitten.. LG |
AW: Ist der Server zu "schnell"?
Immer wieder dieses SizeOf(Integer). Ich verstehe ja was damit gemeint ist. Aber wie soll das funktionieren? ReceiveLength sagt aus wie viel insgesamt ankommen soll, das hab ich kapiert.
Aber Wie komm ich jetzt ans SizeOf(Integer)? Also für meinen Code würde es ja so lauten: ReceiveBuf(Info,SizeOf(info)), so aber ich kann ihm doch nicht sagen, dass er erst empfangen soll, quasi wenn die Länge des Empfangenem Records, das er ja noch gar nich empfangen hat, gleich groß der gesendeten Datenmenge ist... Mein Problem ist doch, um zu wissen wie groß das Empfangene ist, muss ichs doch empfangen... aber nachdem was ihr gesagt habt, soll ich den Befehl erst nutzen wenn alles da ist, aber an die Information komme ich doch vorher gar nicht... nur mal so nebenbei, wenn ich sequenziell jetzt durchgehe kommt bei mir generell nur noch völliger Schrott an, also wenn ich das Record empfange, was ja geht wenn ich schrittweise durchgehe wie ich ja im Startbeitrag schon geschrieben habe, und das obwohl ich an diesem Code gar nichts geändert habe... das passiert mir jetzt schon zum vierten mal, woran liegt das denn immer? |
AW: Ist der Server zu "schnell"?
Und genau hier liegt der Fehler
ReceiveLength sagt dir wieviel empfangen wurde! Wenn das die Daten sind die zum Socket unterwegs sind (i = Integer-Header, d = Daten)
Code:
Dann wird jedes Mal, wenn etwas empfangen wird, das Event aufgerufen.
iiiiddddddddddddddddddddddddddddiiiiddddddddddiiiidddddddddd
Nun kann es eben auch passieren, dass eben immer nur ein Teil der Daten ankommt.
Code:
Zum Zeitpunkt 1 ist ReceiveLength 2 und somit kleiner als SizeOf( Integer ) - warten
1 ii
2 iiiidddddddddddddd 3 ddddddddddddddddddddddddddddiiiiddddddddddiiiidddddddddd Zum Zeitpunkt 2 ist ReceiveLength 18, jetzt lesen wir vom Buffer den Integer-Wert aus Der Buffer wird beim Lesen automatisch um die gelesenen Bytes verkleinert. Jetzt muss man abwarten, bis der Buffer mindestens soviel Bytes enthält, wie der Integer-Wert angekündigt hat und wir können die komplette Nachricht vom Buffer lesen. |
AW: Ist der Server zu "schnell"?
Delphi-Quellcode:
Also könnte ich doch z.B. sone Abfrage hier gestalten, es soll nur weitergehn wenns die bufferlaenge gleich der empfangenen Länge ist. Würde das jetzt so stimmen?
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket); var Info:TInfo; Zahl:Integer; Laenge,VergleichLaenge:integer; begin IDMSG:=Socket.ReceiveText; Laenge:=Length(IDMSG); Laenge:=Laenge + Socket.ReceiveBuf(Info,SizeOf(Info)); if Socket.receivelength = Laenge then ALso dass man statt mit der If-Then-Else Condition lieber mit ner Whileschleife arbeiten sollte weil man sonst aus der OnRead Prozedur längst rausgeflogen ist eh die Daten angekommen sind, das weiß ich ja selbst, aber es geht mir erstmal IMMER NOCH darum zu verstehn wie ich jetzt auf den Buffer zugreife denn das weiß ich jetzt immer noch nicht! Wie bereits gesagt, wie ich was mit ReceiveLength vergleiche hab ich ja kapiert, aber ich muss ja irgendwo die INformation herbekommen wie viel mir gesendet werden SOLL... :wiejetzt: |
AW: Ist der Server zu "schnell"?
Wenn die Daten verschickt werden, ermittelt der Sender die Größe der Nachricht (ein Integer) und schickt diesen als erstes auf die Reise. Direkt danach die Daten.
Der Empfänger liest jetzt erst den Integer aus dem Buffer und weiß wie groß die Nachricht ist und empfängt - bzw. Wartet bis alle Daten da sind - die Nachricht. |
AW: Ist der Server zu "schnell"?
Code:
Weil das TInfo ja immer gleich groß ist, kann man sich den Integer theoretisch auch sparen, aber so müsste es aussehen denke ich...
type
TForm1 = class(TForm) private LaengeNaechsteNutzdaten: Integer; end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Info: TInfo; begin // Gibt es genug, um die Länge auszulesen? if (LaengeNaechsteNutzdaten = 0) and (Socket.ReceiveLength >= SizeOf(LaengeNaechsteNutzdaten)) then // Dann auslesen Socket.ReceiveBuf(LaengeNaechsteNutzdaten, SizeOf(LaengeNaechsteNutzdaten)); if (LaengeNaechsteNutzdaten > 0) and (Socket.ReceiveLength >= LaengeNaechsteNutzdaten) then begin // Wenn der Puffer die Länge der Nutzdaten erreicht hat, auslesen Socket.ReceiveBuf(Info, LaengeNaechsteNutzdaten); // Daten verarbeiten... MachWasMitDaten(Info); LaengeNaechsteNutzdaten:= 0; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz