-
Здравствуйте!
Пишу многопоточный сервер на 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;
-
вот это вот Application.ProcessMessages; в потоке явно лишнее... всегда, а в данном случае оно похоже впадает на нем в цикл ожидания на нем и не дает завершится соединению, а у разных операционок есть разные ограничения. например на 10 открытых (полуоткрытых) соединений у WinXP. (но даже если не связано все одно УБРАТЬ!)
-
Спасибо за совет! Правда это не влияет на ситуацию. :(
-
> Правда это не влияет на ситуацию. :( ограничений с оси правильность кода и правда не снимает вот тут недавно обсуждали... http://pda.delphimaster.net/?id=1301633276&n=3http://pda.delphimaster.net/?id=1301662532&n=3можешь проверить кстати... запачтить ось по "торентовским правилам" (не 10 а 100 - 200 поставить 18 пост во второй ссылке). ну и посмотри от этого или нет (правда это "знахарство", по "правильному" ты должен досконально узнать ВСЕ, и только после этого хоть пальцем шевелить... но зато наверняка. выбирай в общем кем быть ;)).
-
Плиз, за дурака не держите. С такой мелочью я бы сам давно разобрался. Давно tcpip.sys пропатчен на 300 соединений, да и еще стоит учесть, что на сервере работает программа другого разработчика и вполне успешно держит соединения более 10, а вот когда я ее заменяю своей - вылезает данная проблема.
-
Скажи, любезный, а ты зачем вообще создавал TWinSocketStream, если не используешь его, кроме как только для вызова WaitForData ?
-
Так по наследству осталось после изменения кода чтения пакетов от клиента, сомнений особо не вызывало, т.к. исправно работало. Ранее было так: FillChar(fRequest,256,0);
if fSocketStream<>nil then fSocketStream.read(fRequest,256)
else begin
ClientOff(msg_Connection_Closed);
break;
end;
Но как оказалось в 2009 это работает криво. Если здесь проблема, то как лучше реализовать?
-
Выкинь вообще нафих этот стрим.. Без явной небходимости он только лишнее колесо у телеги)
-
> ManowarVIP (07.04.11 11:46) [4]
А чего же тогда не разобрался с Application.ProcessMessages, ведь это же в любом букваре указано?
-
> да и еще стоит учесть, что на сервере работает программа > другого разработчика и вполне успешно держит соединения > более 10, а вот когда я ее заменяю своей - вылезает данная > проблема.
Наверно у другого разработчика программа написано правильно.
-
> Плиз, за дурака не держите. С такой мелочью я бы сам давно разобрался. не задавай дурацких вопросов тогда, иле вернее по дурацки... если бы разобрался, да еще и в вопросе указал ... типа - "ошибки ххххх показывающей, что упираемся в ограничение, у меня нет. значит дело в чем то другом." никто бы и не дернулся тогда тебе что то на эту тему советовать.
-
Спасибо за советы. Тему можно считать закрытой. Много болтовни, толку мало. Код переписан на другой компоненте и все работает.
-
> на другой компоненте
"Компонента" - она вообще-то "он").. мужик она)
Ну это так, мелочи.. До кучи к Application.ProcessMessages и прочим якобы мелким и "несущественным" несуразностям, от коих, в конечном итоге, зависит работоспособность программы)
-
Удалено модератором Примечание: Спокойнее
|