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
 
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, 10: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
 


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 22:50 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