Конференция "Сети" » Непонятная ситуация с количеством подключений TServerSocket [WinXP]
 
  • ManowarVIP (07.04.11 06:51) [0]
    Здравствуйте!

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

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

    Писал под RAD 2009, но пробовал и под D6 запускать - проблема та же.

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

    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;
  • sniknik © (07.04.11 07:41) [1]
    вот это вот Application.ProcessMessages; в потоке явно лишнее... всегда, а в данном случае оно похоже впадает на нем в цикл ожидания на нем и не дает завершится соединению, а у разных операционок есть разные ограничения. например на 10 открытых (полуоткрытых) соединений у WinXP.
    (но даже если не связано все одно УБРАТЬ!)
  • ManowarVIP (07.04.11 08:54) [2]
    Спасибо за совет!
    Правда это не влияет на ситуацию. :(
  • sniknik © (07.04.11 10:19) [3]
    > Правда это не влияет на ситуацию. :(
    ограничений с оси правильность кода и правда не снимает

    вот тут недавно обсуждали...
    http://pda.delphimaster.net/?id=1301633276&n=3
    http://pda.delphimaster.net/?id=1301662532&n=3
    можешь проверить кстати... запачтить ось по "торентовским правилам" (не 10 а 100 - 200 поставить 18 пост во второй ссылке). ну и посмотри от этого или нет (правда это "знахарство", по "правильному" ты должен досконально узнать ВСЕ, и только после этого хоть пальцем шевелить... но зато наверняка. выбирай в общем кем быть ;)).
  • ManowarVIP (07.04.11 11:46) [4]
    Плиз, за дурака не держите. С такой мелочью я бы сам давно разобрался.
    Давно tcpip.sys пропатчен на 300 соединений, да и еще стоит учесть, что на сервере работает программа другого разработчика и вполне успешно держит соединения более 10, а вот когда я ее заменяю своей - вылезает данная проблема.
  • Сергей М. © (07.04.11 12:12) [5]
    Скажи, любезный, а ты зачем вообще создавал TWinSocketStream, если не используешь его, кроме как только для вызова WaitForData ?
  • ManowarVIP (07.04.11 12:25) [6]
    Так по наследству осталось после изменения кода чтения пакетов от клиента, сомнений особо не вызывало, т.к. исправно работало.
    Ранее было так:

    //Читаем пакет от клиента
    FillChar(fRequest,256,0);
    if fSocketStream<>nil then fSocketStream.read(fRequest,256)
    else begin
    ClientOff(msg_Connection_Closed);
    break;
    end;



    Но как оказалось в 2009 это работает криво.

    Если здесь проблема, то как лучше реализовать?
  • Сергей М. © (07.04.11 12:57) [7]
    Выкинь вообще нафих этот стрим..
    Без явной небходимости он только лишнее колесо у телеги)
  • Anatoly Podgoretsky © (07.04.11 14:25) [8]

    > ManowarVIP   (07.04.11 11:46) [4]

    А чего же тогда не разобрался с Application.ProcessMessages, ведь это же в любом букваре указано?
  • Anatoly Podgoretsky © (07.04.11 14:30) [9]

    > да и еще стоит учесть, что на сервере работает программа
    > другого разработчика и вполне успешно держит соединения
    > более 10, а вот когда я ее заменяю своей - вылезает данная
    > проблема.

    Наверно у другого разработчика программа написано правильно.
  • sniknik © (07.04.11 14:55) [10]
    > Плиз, за дурака не держите. С такой мелочью я бы сам давно разобрался.
    не задавай дурацких вопросов тогда, иле вернее по дурацки...
    если бы разобрался, да еще и в вопросе указал ... типа - "ошибки ххххх показывающей, что упираемся в ограничение, у меня нет. значит дело в чем то другом."
    никто бы и не дернулся тогда тебе что то на эту тему советовать.
  • ManowarVIP (07.04.11 20:38) [11]
    Спасибо за советы. Тему можно считать закрытой.
    Много болтовни, толку мало.
    Код переписан на другой компоненте и все работает.
  • Сергей М. © (07.04.11 20:55) [12]

    > на другой компоненте


    "Компонента" - она вообще-то "он").. мужик она)

    Ну это так, мелочи.. До кучи к Application.ProcessMessages и прочим якобы мелким и "несущественным" несуразностям, от коих, в конечном итоге, зависит работоспособность программы)
  • PUSH (16.08.11 00:18) [13]
    Удалено модератором
    Примечание: Спокойнее
 
Конференция "Сети" » Непонятная ситуация с количеством подключений TServerSocket [WinXP]
Есть новые Нет новых   [134435   +13][b:0][p:0.001]