Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi WinSock: TCP Send Window Queue, wieviel Bytes frei/belegt? (https://www.delphipraxis.net/151451-winsock-tcp-send-window-queue-wieviel-bytes-frei-belegt.html)

Sunlight7 18. Mai 2010 18:01


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

Astat 19. Mai 2010 10:05

Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
 
Zitat:

Zitat von Sunlight7
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:

Das Arbeiten mit Select, ist unter Windows das Mittel der Wahl.
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

Sunlight7 19. Mai 2010 18:25

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:

Astat 20. Mai 2010 09:21

Re: WinSock: TCP Send Window Queue, wieviel Bytes frei/beleg
 
Zitat:

Zitat von Sunlight7
..jedoch ist mir die Benutzung von Select bekannt und ich möchte da aber nicht..

OK, select bremst die Übertragung nicht aus, genau das Gegenteil ist der fall!

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.

Sunlight7 20. Mai 2010 12:53

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 18:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz