Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизTServerSocket, TClientSocket. Синхронный и асинхронный, блокирующ Найти похожие ветки
← →
Digitman © (2004-04-25 15:01) [40]
> так чтоб при этом сервер не стал виснуть
"виснет"-то сервер отнюдь не по прихоти сил небесных, а из-за того, что у ты допустил ошибку в алгоритме ... и есть вполне обоснованные подозрения, что ошибка эта - в теле My_procedure() или п/программ из него вызываемых ... а ты говоришь "это в принцепи неважно")
ну если неважно и код ты не намерен приводить, тогда остаются два варианта - либо попрыгать с бубном вокруг своего сервера либо перечитать документацию и вникнуть, что, где, как и для чего у тебя происходит, в соответствии ли с документацией или "от балды"..
← →
Yermek (2004-04-25 15:55) [41]кажется мы не не поняли друг друга (или я непонял)
код я приводил чтоб спросить может ли несколько одновременно подключившихся клиентов, одновременно обращатся к одной процедуре, вернее не клиентов а процедура ClientExceture.
а код программы:begin
inherited FreeOnTerminate := TRUE;
While Not Terminated And ClientSocket.Connected Do
try
fSocketStream := TWinSocketStream.Create( ClientSocket, 60000 );
try
while ( not Terminated ) and ( ClientSocket.Connected ) do
try
cl_text :=ClientSocket.ReceiveText;
cl_ip :=ClientSocket.RemoteAddress;
cl_host :=ClientSocket.RemoteHost;
ac:=fmMain.ServerSocket1.Socket.ActiveConnections;
if (copy(cl_text,1,3)="001") or
(copy(cl_text,1,3)="002") or
(copy(cl_text,1,3)="003") or
(copy(cl_text,1,3)="004") or
(copy(cl_text,1,3)="005") or
(copy(cl_text,1,3)="end") then
begin
if (copy(cl_text,1,3)="001") then
begin
...
fmMain.SentFile(copy(cl_text,5,length(cl_text)-4),nomer);
//Exit;
end;
if (copy(cl_text,1,3)="002") then
begin
fmMain.mJournal.Lines.Add(cl_host + #9 + cl_ip + #9 + "Ñòóäåíò çàêîí÷èë òåñòèðîâàíèå íà êîìïüþòåðå");
...
fmMain.SetResult(cl_host,fn,n,ln,pr,cb,qtest);
end;
if copy(cl_text,1,3)="004" then
begin
...
fmMain.SetTime(cl_ip,copy(cl_text,5,length(cl_text)-4));
end; //
end;//
except
on e:exception do
begin
ClientSocket.Close;
Terminate;
end;
end;
finally
fSocketStream.Free;
end;
except
on e:exception do
begin
ClientSocket.Close;
Terminate;
end;
end;
end;
немного я вырезал, а то код большой
и кстати я слышал что там(ClientExceture) недолжно быть много операций, а у меня их достаточно, как быть?
в пропущенных местах вычисляются входящие в процедуры SentFile SetResult SentFile и я не закрываю клиентский сокет если это важно
и как насчет
> так чтоб при этом сервер не стал виснуть :)
← →
Digitman © (2004-04-26 08:17) [42]ой каша-а-а-а !
столько грубых и мелких ошибок, что ... даже не знаю с чего начать ... проще, наверно, с нуля переписать ..
ну да ладно, начнем с начала ..
> inherited FreeOnTerminate := TRUE;
это зачем ? почему inherited ?
> fSocketStream := TWinSocketStream.Create( ClientSocket,
> 60000 );
это зачем ? где и как используешь ?
← →
Fantasist © (2004-04-27 03:16) [43]
> Digitman © (23.04.04 08:58) [19]
>
> вникни в [3]
> как раз об этом я там и сказал
> в чем же расхождение ?
Расхождение в [1], а не в [3] (а как следствие, небольшое расхождение между [1] и [3]). Я ничуть не сомневаюсь, что ты отлично представляешь предмет о котором говоришь, однако те, кому этот предмет мало знаком могут не суметь скомпилировать твои постинги в одну концепцию. Таким образом может возникнуть недопонимание вследствии слегка непоследовательного изложения. Я просто помню это на своем опыте, как подобные объяснения могут запутывать. Надо сказать, что хорошо объяснить задача весьма непростая и чаще всего все-таки приходилось сталкиваться с не очень понятными изложениями материала.
> а какая разница, WinSock API или не WinSock API ? оболочка
> (в виде упомянутых компонентов) или не оболочка ? Суть от
> этого не меняется.
Суть не меняется - меняется способ подачи данной сути, а это весьма существенно. Увидеть суть чуть ли не основная задача понимания и для достижения этой цели приходиться тратить немало времени. Так просто она не видиться. В данном случае опять же на своем опыте - с сокетами я начал как раз с TClient/ServerSocket и никак не мог их понять. Зачем nonBlocking и ThreadBlocking mode? Что за поток и где он блокирует? Почему при ThreadBlocking создается еще один поток (чтобы его блокировать что ли, а зачем)?
В чем выгода того или иного подхода. Почему говоря про сокеты упоминается "асинхронные" и "блокирующие", но редко "синхронные" и "неблокирующие"? Много таких непонято было, пока я смотрел на эти Дельфийские оболочки. Потом понял, что так я никуда не уеду, и стал смотреть сорс и читать help по Socket API. Только после этого я все понял. Ну в общем, Socket API ближе к сути и эту суть легче познать не нем, и уж после этого распространить дальше (возможно и дальше сокетов). Таков мой личный опыт.
← →
Polevi © (2004-04-27 08:15) [44]> [43] Fantasist © (27.04.04 03:16)
причем тут сокеты вообще, ты еще предложи событийное взаимодействие с операциооной системой начать зучать с WSAAsyncSelect
← →
Fantasist © (2004-04-27 21:00) [45]
> причем тут сокеты вообще
Читаем название темы и первый пост автора.
> предложи событийное взаимодействие с операциооной системой
> начать зучать с WSAAsyncSelect
Может мне еще предложить гланды через известное место удалять? Я не понимаю, чем вызвана такая резкость с Вашей стороны. Я высказал свое мнение по теме и если Вас что-то не устраивает, могли бы на эту указать. А дураками друг друга обзывать весьма не констуктивно.
← →
Polevi © (2004-04-27 21:31) [46]>А дураками друг друга обзывать весьма не констуктивно.
поддерживаю
Страницы: 1 2 вся ветка
Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.033 c