Einzelnen Beitrag anzeigen

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