Mit dieser Methode kannst du blocking auf ankommende Daten warten. Allerdings solltest du dir ein Protokoll überlegen, um Pakete korrekt zu trennen und um zu wissen, wann ein Paket vollständig angekommen ist:
Delphi-Quellcode:
procedure TBasicBackendConnector.ReceivePacket(var Command: Word;
Data: Pointer; var Size: Word);
var
Stream: TWinSocketStream;
Buffer: array[0..1024 * 64 - 1] of Byte;
PacketLength: Word;
begin
Stream := TWinSocketStream.Create(FSocket.Socket, 10000);
try
if (Stream.WaitForData(10000)) then
begin
PacketLength := FSocket.Socket.ReceiveLength;
if (PacketLength > 0) then
begin
if (FPacketSize = 0) then
begin
FSocket.Socket.ReceiveBuf(FPacketSize, 2);
end;
if (FPacketSize > 0) then
begin
if ((PacketLength - 2) >= FPacketSize) then
begin
FSocket.Socket.ReceiveBuf(Buffer[0], FPacketSize);
Size := FPacketSize;
// INFO: Vollständiges Paket ist jetzt im Buffer enthalten
FPacketSize := 0;
end else
begin
ReceivePacket(Command, Data, Size);
end;
end;
end else
begin
FSocket.Close;
end;
end;
finally
Stream.Free;
end;
end;
In diesem Falle sende ich jedem Paket 2 Byte mit der Länge vorweg. Der Empfangsbuffer ist auch nur für Pakete von maximal 2^16 Bytes ausgelegt. Solltest du dir aber relativ leicht anpassen können.
Wenn du magst, schau gerne auch mal in die Demoanwendung für mein kürzlich entwickeltes Netzwerkprotokoll rein:
http://www.delphipraxis.net/170565-n...elem-mehr.html
Dort werden auch die blocking Sockets benutzt. Und eventuell bekommst du dort auch ein paar Anregungen, was das Protokoll angeht.