Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TServerSocket, TClientSocket. Синхронный и асинхронный, блокирующ [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3

Анонимщик ©   (2004-04-22 11:33:00) 

Синхронный и асинхронный, блокирующий и неблокирующий.

Что в контектсе сокетов значит "Синхронный и асинхронный, блокирующий и неблокирующий"?
Я почему-то думал, что синхронный режим - тот, что позволяет обеим сторонам общаться,
синхронизируя посылку данных друг другу. Т.е. работа в синхронном режиме подразумевает
некий диалог между ними.
Но вот читаю: "Асинхронными они названы по той причине, что их выполнение связано с
определенным диалогом и ни начало, ни завершение не ограничено какими-либо временными
рамками". Т.е. с точностью до наоборот. Почему так, можно спросить?

Далее, если асинхронный режим тот, что подразумевает диалог, а не просто пересылку данных
любой их сторон другой стороне, то, выходит, асинхронный режим - блокирующий, т.е.

одна из сторон на время своего посылания данных блокирует другую?
И еще одно. Если режим асинхронный, то тогда нужно выставить тип для сервера - ctThreadBlocking,
а для клиента - ctBlocking? Тогда сервер для каждого клиентского соединения создает поток,
который с этим клиентом и работает. И вот мне не понятно, почему того же нельзя сделать
и для синхронного режима в принципе, т.е. почему нет этой возмодности.

Короче, я все напутал, прошу помочь распутать.

И последнее. Можно ли создавать TClientSocket не в главном потоке? Прочитал, что операционная
система сообщает о событиях для сокета в то окно, с контекстом потока которого сокет связан.
Естественно, в дочернем потоке никакого окна нет. Так дойдет ли куда-нибудь сообщение вообще?
Впрочем, так я уже делал, но, кроме этого, создавал еще и поток, который занимается обработкой
принимаемых/отправляемых данных для этого сокета. И данные приходят и отправляются. Но смутные
сомнения терзают все равно.

Короче говоря, пожалуйста, те, кто знают, пусть разжуют, правильно сформулируют и ответят.


Polevi   (2004-04-27 21:31:00) [1]

>А дураками друг друга обзывать весьма не констуктивно.
поддерживаю


Fantasist   (2004-04-27 21:00:00) [2]


> причем тут сокеты вообще


 Читаем название темы и первый пост автора.


> предложи событийное взаимодействие с операциооной системой
> начать зучать с WSAAsyncSelect


 Может мне еще предложить гланды через известное место удалять? Я не понимаю, чем вызвана такая резкость с Вашей стороны. Я высказал свое мнение по теме и если Вас что-то не устраивает, могли бы на эту указать. А дураками друг друга обзывать весьма не констуктивно.


Polevi   (2004-04-27 08:15:00) [3]

> [43] Fantasist ©   (27.04.04 03:16)
причем тут сокеты вообще, ты еще предложи событийное взаимодействие с операциооной системой начать зучать с WSAAsyncSelect


Fantasist   (2004-04-27 03:16:00) [4]


> 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 ближе к сути и эту суть легче познать не нем, и уж после этого распространить дальше (возможно и дальше сокетов). Таков мой личный опыт.


Digitman   (2004-04-26 08:17:00) [5]

ой каша-а-а-а !

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

ну да ладно, начнем с начала ..


> inherited FreeOnTerminate := TRUE;


это зачем ? почему inherited ?


> fSocketStream := TWinSocketStream.Create( ClientSocket,
> 60000 );


это зачем ? где и как используешь ?


Yermek   (2004-04-25 15:55:00) [6]

кажется мы не не поняли друг друга (или я непонял)
код я приводил чтоб спросить может ли несколько одновременно подключившихся клиентов, одновременно обращатся к одной процедуре, вернее не клиентов а процедура 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-25 15:01:00) [7]


> так чтоб при этом сервер не стал виснуть


"виснет"-то сервер отнюдь не по прихоти сил небесных, а из-за того, что у ты допустил ошибку в алгоритме ... и есть вполне обоснованные подозрения, что ошибка эта  - в теле My_procedure() или п/программ из него вызываемых ... а ты говоришь "это в принцепи неважно")

ну если неважно и код ты не намерен приводить, тогда остаются два варианта - либо попрыгать с бубном вокруг своего сервера либо перечитать документацию и вникнуть, что, где, как и для чего у тебя происходит, в соответствии ли с документацией или "от балды"..


Yermek   (2004-04-25 14:55:00) [8]

Да и это в принцепи неважно, я просто немогу закрыть клиентский сокет так чтоб при этом сервер не стал виснуть.


Digitman   (2004-04-25 12:29:00) [9]


> Yermek   (24.04.04 22:58) [37]


я не телепат и догадываться, что у тебя там творится в теле My_procedure(), не намерен


Yermek   (2004-04-24 22:58:00) [10]

> Digitman ©   (23.04.04 16:48) [21]

> либо закрыть все активные соединения (в списке
> Connections) ,прежде чем делать ServerSocket.Close

все равно если клиент сам рызрывает связь, программа сервера все равно виснет, а если с клиента послать допустим SentText('close') а сервер обработает потом зактоет сам клиента то все нормально работает

а можно как нибуть почеловечески его закрыть.

> изменить радикальным образом явно неверный алгоритм метода
> ClientExecute

а вот этого я не понял... совсем...


Piter   (2004-04-24 22:22:00) [11]

Игорь Шевченко (24.04.04 21:16) [35]
С++ Builder генерирует .h файлы по паскалевским


а я и не знал. Значит, C++ Builder поддерживает синтаксис OP?


Игорь Шевченко   (2004-04-24 21:16:00) [12]

Piter ©   (24.04.04 12:28)

А чего понимать ? С++ Builder генерирует .h файлы по паскалевским. Для  символов, отмеченных EXTERNALSYM уже сгенерированы .h файлы, как правило, корпорацией Майкрософт, чтобы не было конфликтов, символы не участвуют в генерации.


Yermek   (2004-04-24 19:32:00) [13]

побробую, что получится напишу, все равно спасибо


Polevi   (2004-04-24 19:22:00) [14]

cs:=TCritycalSection.Creaate;

..
 cs.Enter; //пытаемся зайти в секцию, если она занята другим потоком - засыпаем, пока секцмя не освободится
 try
  //здесь работаем с глобальной перменной монопольно
 finally
   cs.Leave; //освобожлдаем секцию  
 end;


Yermek   (2004-04-24 19:13:00) [15]

извени за назойлевость, а как это использовать критические секции их помещать куда надо или проверять как то?


Polevi   (2004-04-24 19:11:00) [16]

напрмер использовать критические секции


Yermek   (2004-04-24 19:07:00) [17]

я использую глобальные перемнные и как быть?
с использованием синхронизации, а это как с глобальными переменными проводить синхронизацию?


Polevi   (2004-04-24 17:56:00) [18]

не вылезет, если не будешь в ней использовать глобальные переменные без синхронизации


Yermek   (2004-04-24 17:21:00) [19]

У меня еще вопрос созрел:

...
 Private
   sss:array[1..100] og string;
 Public
   ...

type
 EServerThread = class( Exception );
 TServerThread = class( TServerClientThread )
 private
   fSocketStream : TWinSocketStream;
 public
   procedure ClientExecute; override;
 end;

procedure My_procedure;
begin
...
end;

procedure TServerThread.ClientExecute;
begin
 ...
 My_procedure;
 sss[i]:=text;
 ...
end;


Вопрос: процедура ClientExecute будет вызывать процедуру My_procedure как только придет какое либо сообщение от клиента, невылезет ли ошибка при попытке обращения к ней, если клиентов подцепилось несколько одновременно и то же самое про переменные в Private или в Public


Piter   (2004-04-24 12:28:00) [20]

Справку я читать умею. Я не понял что написано


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо