Also ich würde auf keinen Fall zwei Threads für einen Socket verwenden; das macht alles nur noch komplizierter.
Wenn du die recv()-Funktion aufruft; den Buffer aber als nil übergibst, dann solltest du entweder 0 oder die Anzahl der Bytes im Empfangspuffer oder einen Fehlercode erhalten.
Delphi-Quellcode:
procedure MeinThread.Execute;
var i: integer;
begin
repeat
i := recv(sock, Pointer(nil)^, -1);
if i > 0 then
begin
i := recv(sock, buffer, sizeof(buffer));
...
end;
Sleep(0); // Rechenzeit abgeben, andernfalls 100% CPU
until i <= 0;
end;
Und ansonsten:
Das direkte Benützen der WinSock
API ist ziemlich kompliziert.
Die
API ist viel mächtiger als das was ein Anwendungsprogrammierer braucht.
Also braucht man im Grunde genommen eine
vereinfachte API für
TCP/
IP.
Dieses Problem wurde schon zig-fach gelöst.
Aber solange es Programmierer gibt sind sie dazu verdammt die gleichen Aufgaben immer wieder neu zu lösen.
Empfehlenswert ist die
Unit $Delphi\Source\
VCL\
ScktComp.
Die Komponenten müssen nicht installiert werden.
Man kann damit zwar nur
TCP/IPv4 betreiben, aber der Code ist relativ schlank und durch die Events OnRead, OnConnect usw. ist die Verwendung ziemlich einfach.