Показать сообщение отдельно
  #1  
Старый 07.04.2011, 01:33
ManowarVIP ManowarVIP вне форума
Прохожий
 
Регистрация: 07.04.2011
Адрес: Россия, Пермь
Сообщения: 1
Версия Delphi: 6, 2009
Репутация: 10
Печаль Непонятная ситуация с количеством подключений TServerSocket

Здравствуйте!

Пишу многопоточный сервер на TServerSocket.
В принципе все реализовал, но при тестовых прогонах не пробовал более 3-6 подключений, а в момент генерального теста подключений было более 10 и вдруг выяснилось, что реально могут работать только 8 соединений.
Когда начал разбираться, оказалось, что начиная с 9 соединения новый поток создается, но данные от клиента не приходят и возникает таймаут на этой строке: if (not Terminated) and (not fSocketStream.WaitForData(TIMEOUT)) then

Подскажите пожалуйста, в чем может быть причина?

Вот основной код потока:

Код:
procedure TServerThread.ClientExecute;
var fRequest  : AnsiString;
      p              : Integer;
begin
 
  try
 
    fSocketStream:=TWinSocketStream.Create(ClientSocket,TIMEOUT);
    try
 
      while (not Terminated) and (ClientSocket.Connected) do
        try
          if (not Terminated) and (not fSocketStream.WaitForData(TIMEOUT)) then
          begin
             ClientOff(msg_Connection_Timeout);
             break;
          end;
 
          if (not Terminated) then
          begin
 
             fRequest:='';
             if fSocketStream<>nil then begin
                SetLength(fRequest,ClientSocket.ReceiveLength());
                SetLength(fRequest,ClientSocket.ReceiveBuf(Pointer(fRequest)^,Length(fRequest)));
             end
              else begin
               ClientOff(msg_Connection_Closed);
               break;
             end;
 
             p:=Pos(Chr($0D),fRequest);
 
             if (p>0) and (not Terminated) then begin
 
               //Обработка пакетов
 
             end
              else begin
                 ClientOff(msg_Connection_Closed);
              end;
          end;
 
          Application.ProcessMessages;
 
        except
          on e:exception do
          begin
            ClientOff(msg_Connection_Closed);
          end;
        end;
    finally
      ClientOffmsg_Connection_Closed);
    end;
  except
    on e:exception do
    begin
      ClientOff(msg_Connection_Closed);
    end;
  end;
 
  inherited;
 
end;
Ответить с цитированием