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

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

ServerSocket не обрабатывает данные от 2 клиентов [D6, Win2k]


slgeo ©   (2004-05-08 14:01:00) 

Уважаемые мастера! Возникла такая проблема (возможно не совсем связанная с сокетами):
Использую TServerSocket в режиме stThreadBlocking.
Так вот, если серверная часть передает клиенту данные
ClientSocket.SendStream(TMyFileStream.Create(strFile, fmOpenRead or fmShareDenyWrite))
и в этот момент подключается другой клиент, то для первого клиента передача обрывается, а второй клиент подвисает на подключении к базе данных. Для наглядности приведу кусок кода:

procedure TDbServerThread.ClientExecute;
var
 Stream: TWinSocketStream;
 ...
begin
 LogMsg := DateTimeToStr(Now)+'Создаем поток... ';
 Synchronize(UpdateLog);
 Stream := TWinSocketStream.Create(ClientSocket, 30000);
 IBDatabase := TIBDatabase.Create(nil);
 IBDatabase.DatabaseName := Form1.dbName;
 IBDatabase.LoginPrompt := False;
 IBDatabase.Params.Add('user_name=sysdba');
 IBDatabase.Params.Add('password=masterkey');
 IBDatabase.Params.Add('LC_CTYPE=WIN1251');
 IBDatabase.TraceFlags := [tfConnect,tfError,tfQExecute,tfTransact];
 LogMsg := DateTimeToStr(Now)+'Соединяемся с БД... ';
 Synchronize(UpdateLog);
 IBDatabase.Connected := True; //здесь подвисаем
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LogMsg := DateTimeToStr(Now)+'Подключились к БД';
 Synchronize(UpdateLog);
 IBTransaction := TIBTransaction.Create(nil);
 IBTransaction.DefaultDatabase := IBDatabase;
 try
   while not Terminated and ClientSocket.Connected do
   begin
     // initialize (thread might be reused)
     if Stream.WaitForData(30000) then
     begin
       Buffer := '';
       strIn := '';
       SetLength(Buffer, 18);
       LogMsg := DateTimeToStr(Now)+' ********************** Клиент ' + ClientSocket.RemoteAddress +' (' +ClientSocket.RemoteHost+')' +'******************************';
       Synchronize(UpdateLog);
//        Form1.AddToLog(DateTimeToStr(Now)+' ********************** Клиент ' + ClientSocket.RemoteAddress +' (' + ClientSocket.RemoteHost+')' +'******************************');
       nRead := Stream.Read(Buffer[1], 18);
       if nRead = 0 then
       begin
         ClientSocket.Close;
         Break;
       end;
     SetLength (Buffer, nRead);
     StrIn := StrIn + Buffer;
     LogMsg := DateTimeToStr(Now)+' Клиент: ' + ClientSocket.RemoteAddress + ': ' + strIn;
     Synchronize(UpdateLog);
     end;
   ...
   ...
end;


Digitman   (2004-05-09 12:30:00) [1]

try
 IBDatabase.Connected := True;
except
on e:exceptiondo
  messagebox(0, PChar(e.classname + ' ' e.message), '', mb_ok);  
end;


slgeo   (2004-05-08 15:49:00) [2]

возможно вопрос задан не в той тематике, но есть подозрения что это больше связано как-то с сокетным потоком.
Поскольку параллельный запуск поиска по БД в отдельных Threads вполне нормально отрабатывает.


slgeo   (2004-05-08 15:45:00) [3]

Извиняюсь, немного неточно расписал ситуацию:
Правильнее так, при первом же подключении второго клиента любые обращения к БД не проходят, т.е. для второго клиента зависает метод Database.Open (или Connected := True), а первый клиент уже не может в дальнейшем обращаться к БД (выполнять запросы), несмотря на то,что у него собственное соединение, транзакция, поток. Но ведь, если подключен один клиент, то весь обмен проходит без проблем.

>Verg
Переменные IBDatabase,IBTransaction объявлены в разделе var метода TDbServerThread.ClientExecute


Verg   (2004-05-08 15:28:00) [4]


> Так вот, если серверная часть передает клиенту данные
> ClientSocket.SendStream(TMyFileStream.Create(strFile, fmOpenRead
> or fmShareDenyWrite))


Где? В приведенном коде этого нет.


> IBDatabase


Где описана эта переменная?


slgeo   (2004-05-08 14:51:00) [5]

Ни о чем.
А как связан запрет доступа к передаваемому файлу с подключением к БД?


Rouse_   (2004-05-08 14:44:00) [6]

> fmShareDenyWrite
Ни о чем не говорит?


Наверх

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