AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi WinSock: TCP Send Window Queue, wieviel Bytes frei/belegt?
Thema durchsuchen
Ansicht
Themen-Optionen

WinSock: TCP Send Window Queue, wieviel Bytes frei/belegt?

Ein Thema von Sunlight7 · begonnen am 18. Mai 2010 · letzter Beitrag vom 20. Mai 2010
Antwort Antwort
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#1

WinSock: TCP Send Window Queue, wieviel Bytes frei/belegt?

  Alt 18. Mai 2010, 19:01
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

MfG, Sun
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

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

  Alt 19. Mai 2010, 11:05
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
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
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#3

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

  Alt 19. Mai 2010, 19:25
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
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

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

  Alt 20. Mai 2010, 10:21
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.
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#5

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

  Alt 20. Mai 2010, 13:53
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.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 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