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