Добрался наконец до серверной части своей экспериментальной "поделки" - клиент-серверной передачи данных из БД1 в БД2. Проверил результат на локальной машине (коннект по адресу 127.0.0.1) и по локалке (две машины в сети 192.168.Х.Х) - коннект есть! Значится сокетная часть практически закончена. Что радует.
Что НЕ радует:
1. Сервер принимает события только в режиме stThreadBlocking... т.е. - асинхронный тип. Вследствие того что я собираюсь из каждого соединения производить некие запросы в БД1 - ИМХО потокобезопаснее было бы организовать монопольный доступ к БД1 от каждого соединения. Видимо будем рыть в сторону мьютексов - для обеспечения безопасности "критической области" - БД1.
2. Сервер фиксирует лишь события OnGetSocket и OnAccept. В смысле - почему-то до события OnClientConnect дело не доходит, хотя со стороны клиента фиксируется установление соединения. Правда оно сразу же разрывается (что также не приводит к возникновению события OnClientDisconnect со стороны сервера). Доберусь до передачи данных - посмотрим что будет.
3. Ошибка уровня privileged instruction... Это - самое неприятное. Сначала чуток об архитектуре "приложения": Что серверный сокет, что клиентский - запускаются в отдельных потоках, т.е. основная VCL-форма постоянно активна и воспринимает пользовательский ввод, а также - отображает события сокетов из потоков (реализовано через Synchronize). Ошибка же происходит в момент завершения работы клиентского потока - в конце процедуры Execute.
Код:
procedure TMyWinSockThread.Execute; begin if Not Assigned(Socket) then Socket := TClientSocket.Create(ThrOwner); ................ if Assigned(Socket) then begin Socket.Close; FreeAndNil(Socket); - ЗДЕСЬ ОШИБКА, блин... end; end; |
т.е. - на завершении потока идет удаление созданного сокета, а после уже НИЧЕГО нет. Но сокет удаляться не желает. При этом - такая же конструкция но с серверным сокетом прекрасно отрабатывает.
Код:
procedure TServerWinSockThread.Execute; begin if Not Assigned(Socket) then Socket := TServerSocket.Create(ThrOwner); ................ if Socket.Active then Socket.Close; if Assigned(Socket) then FreeAndNil(Socket); - А ЗДЕСЬ НЕТ ОШИБКИ... end; |
Вот такая загогулина... Чешу репу и медитирую над кодом.
|