![]() |
WinSock: TCP Send Window Queue, wieviel Bytes frei/belegt?
Abend DP!
Gibt es eine Möglichkeit, herauszufinden wieviele Bytes im Sendebuffer eines Sockets aktuell frei/belegt sind? Man kann zwar mit Select warten bis der Buffer komplett gesendet wurde, aber das is nicht ganz das grüne vom Ei :mrgreen: MfG, Sun |
Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
Zitat:
Der Socket kann solange beschrieben werden bis der Buffer voll, oder der Socket Layer nicht mehr imstande ist, zu einem bestimmten Augenblick zu senden. Wenn dies der Fall ist, wird ein WSAEWOULDBLOCK zurückgeliefert. Auf diese "Nachricht" muss speziell reagiert werden. Siehe Sample.
Delphi-Quellcode:
procedure TCliCon.SendMsg(MsgID: Byte; ptrData: Pointer; cbSize: Integer);
const HEADER_SIZE = sizeof(Byte) + sizeof(integer); var ErrorCode: integer; fdSet: TFDSet; Begin try FSendBuf.Seek(0, 0); FSendBuf.Write(MsgID, sizeof(Byte)); FSendBuf.Write(cbSize, sizeof(integer)); FSendBuf.Write(ptrData^, cbSize); Inc(cbSize, HEADER_SIZE); if FSocket.SendBuf(FSendBuf.memory^, cbSize, ErrorCode) <= 0 then begin if ErrorCode = WSAEWOULDBLOCK then begin FD_ZERO(fdSet); fdSet.fd_count := 1; fdSet.fd_array[0] := FSocket.SocketHandle; if (Select(0, nil, @fdSet, nil, nil) <> 1) or (FSocket = NIL) or (not FSocket.Connected) then EXIT; FSocket.SendBuf(FSendBuf.memory^, cbSize, ErrorCode); end; end; except on e:exception do begin if Assigned(@ServerObj.CBClientError) then begin ServerObj.CBClientError('[asyncsvr.dll] EXCEPTION: [ TServerObj.SendMsg ] > ' + e.Message ); end; end; end; end; lg. Astat |
Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
Thx für Deine Antwort, jedoch ist mir die Benutzung von Select bekannt und ich möchte da aber nicht, das die Anwendung bei langsamen Verbindungen lagt, bzw. was wichtiger ist, wenn grad mehr Daten übertragen werden wollte ich eine Nachricht mit Vorzug zu senden, was aber nicht möglich ist, wenn erst die ganzen Daten im Buffer noch gesendet werden müssen.
Im Moment denk ich grad drüber nach eine Lsite mit den zu sendenden Daten zu erstellen und auf FD_WRITE Messages zu reagieren :gruebel: |
Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
Zitat:
1. Es werden Daten in den Socket geschrieben (z.B. sehr schnell in einer Schleife ~100 MB/s) 2. Irgenwann ist der Sendbuffer voll, erst dann wird als Result ein WSAEWOULDBLOCK zurückgeliefert. 3. Hier Select wie im Sample verwenden. 4. Select wartet hier automatisch nun solange, bis der Socket wieder senden kann. Um den Zustand des Sendebuffers, des Netzwerks, Kapazität. etc. braucht man sich keine Gedanken machen. Dies wird alles automatisch vom Socket erledigt. D.h. Select wird sowieso nur dann eingesetzt wenn der Socket aus welchen Gründen auch immer, überlastet ist. Selber irgendwelche Stati auszuwerten ist nicht notwendig! lg. |
Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
Wir reden da von unterschiedlichen Dingen.
Bei select wird die (Client)anwendung blockiert und zumindest bei Modemnutzern kommt es recht schnell vor, das der Buffer voll is und somit die Anwendung hängt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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