Hallo Community!
Ich habe einen Server mithilfe der WinSock programmiert, der Daten von einem Client zum anderen versendet. Jetzt kommt es allerdings oft vor, dass Client 1 10x in der sec. einen string an den server sendet, die recv()-func allerdings nicht sofort ausgeführt wird. Wenn die recv()-func ausgeführt wird, befinden sich ca. 6.3 (von 10) strings in dem Puffer, obwohl ich mithilfe von recv() jeden string einzeln erhalten möchte.
Hier mal der wichtigste Ausschnitt:
Delphi-Quellcode:
FTimeVal.tv_sec := 0;
FTimeVal.tv_usec := 1;
ClientList := TIntegerList.Create;
try
while Server.FServerRunning do
begin
FD_ZERO(FDSet);
FD_SET(Server.AccSock, FDSet);
for i := 0 to ClientList.Count-1 do
FD_SET(ClientList[i], FDSet);
{
If time-out is a null pointer, select will block indefinitely
until at least one descriptor meets the specified criteria.
-------------------------------------------------------------
-1 = SOCKET_ERROR
0 = keine Daten vorhanden
}
if (select(0, @FDSet, nil, nil, @FTimeVal) > 0) then
begin
if not FD_ISSET(Server.AccSock, FDSet) then
begin
w := 0;
count := ClientList.Count;
while (w < count) do
begin
if FD_ISSET(ClientList[w], FDSet) then
begin
SetLength(Buffer, MAXLEN);
BytesRead := recv(ClientList[w], Buffer[1], MAXLEN, 0);
[...]
Könnt ihr mir sagen, was ich ändern muss, damit ich den Thread jederzeit, wann ich will, mithilfe der Variablen
Server.FServerRunning (einfach innerhalb einer Critical Section auf false setzen) beenden kann und doch auf JEDES Datenpaket des Clients reagieren kann?
mfg Nogge