vermutlich wirst du nicht um den Non-Blocking-Mode herumkommen.... und für die Kommunikation zwischen den Client-Threads wird irgend eine Art von Thread-Safen Queue benötigt...
pseudo-code:
Code:
while ClientConnected do begin
if networkDataAvailable then pushQueueData
if queueDataAvailable then sendNetworkData
end;
(wobei die *DataAvailable für beispielsweise 200ms blockieren, wenn keine Daten vorhanden sind, so dass nicht die gesamte CPU beübt wird.... die daraus resultierende Latenz ist bei einem Chat-System nicht störend...)
auf Dinge wie concurrent Socket-Operationen mehrere Threads auf dem selben Socket würde ich mich nicht einlassen... das kracht über kurz oder lang...
PS: hier spielst du mit dem Feuer (
access violation / live lock):
Delphi-Quellcode:
while True do
begin
if recv(Sock, MsgBuffer, sizeof(MsgBuffer), 0) > 0 then
AddLogText(hApp, IDC_LV, Format(rsMsg, [string(MsgBuffer)]), 2);
end;
besser so:
Delphi-Quellcode:
while true do begin
r:=recv(Sock, MsgBuffer, sizeof(MsgBuffer) - 1, 0); // #0 muss auch Platz haben
if not (r > 0) then break; // recv gibt 0 zurück, wenn Connection geschlossen wurde
MsgBuffer[r]:=#0;
AddLogText(hApp, IDC_LV, Format(rsMsg, [string(MsgBuffer)]), 2);
end;