Einzelnen Beitrag anzeigen

Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

WinSock: recv()-Puffer wird überschrieben

  Alt 27. Aug 2006, 13:40
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
  Mit Zitat antworten Zitat