Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.17;
Скачать: CL | DM;

Вниз

Socket.ReceiveBuf ломается с ИС   Найти похожие ветки 

 
Diamond ©   (2006-11-27 18:18) [0]

Здравствуйте всем.
Реализован "сервер" на основе TServerSocket
в потоке(не основном, в нем же создан TServerSocket) последовательно обрабатываю все коннекты. Событие OnClientRead не обрабатываю, потому что в существующей архитектуре потока это будет не удобно. Просто на очередной итерации потока(в Execute) беру очередной сокет и пытаюсь вычитать из него данные(Socket.ReceiveBuf). Перед каждой такой операций чтения проверяю Socket.Connected.
Проблемма заключается в том, что иногда во время выполнения Socket.ReceiveBuf прилетает Exception (access violation at ... read ...) . Судя по адресу ломается при входе в критическую секцию.
Есть подозрение, что клиент с той стороны уже отвалился или еще что нибудь, в общем сокет не готов отдавать данные.
Собственно, вопрос, как же проверить могу ли я прочитать данные из сокета без использования события OnClientRead.
было предложение перейти на Indy, но переход достаточно тяжелый и не желателен.
Заранее спасибо.


 
Орион ©   (2006-11-27 18:25) [1]

то что клиент "с той стороны отвалился" еще не повод для AV.


 
Diamond ©   (2006-11-27 18:28) [2]

>Орион
согласен. это было всего лишь предположение.

кстати, забыл добавить: У ServerSocket тип сервера неблокирующий


 
Орион ©   (2006-11-27 18:34) [3]

function ReceiveBuf(var Buf; Count: Integer): Integer;
А с буфером все ок? Он создан и имеет нужный объем?


 
Diamond ©   (2006-11-27 18:38) [4]

>Орион
да, все в порядке. потому что я пакеты маленькие и читаю я по 1 байту.
var
 b: byte;
 tmp: string;
....
while(Socket.Connected)and
      (Socket.ReceiveBuf(b, 1) = 1)do
begin
tmp := tmp + CHR(b);
if b = 124 then
  break;
end;
далее идет обработка полученной строки


 
savva ©   (2006-11-27 20:57) [5]


> кстати, забыл добавить: У ServerSocket тип сервера неблокирующий

а вот это наверное опрометчиво. Логика работы TThread обычно редко выходит за рамки метода Execute. А неблокирующий сокет искользует событийный механизм. Что не характерно для TThread, да и использовать события в нити сложнее чем перейти на блокирующий сокет.

> Собственно, вопрос, как же проверить могу ли я прочитать
> данные из сокета без использования события OnClientRead

перейти на блокирующий сокет


 
Сергей М. ©   (2006-11-28 08:26) [6]


> while(Socket.Connected)and
>       (Socket.ReceiveBuf(b, 1) = 1)do


Кто есть Socket в данном контексте ?


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


Прямо так и проверить - вызвать ReceiveBuf().
Но такой подход к решению задачи в неблок.режиме неверен в корне.


 
Diamond ©   (2006-11-29 13:33) [7]

Спасибо всем кто откликнулся.
Вопрос решился. просто я не отлавливал событие ClientDisconnect и в итоге пытался использовать объект, который уже уничтожен.


 
Сергей М. ©   (2006-11-29 13:35) [8]

Ерунда какая-то



Страницы: 1 вся ветка

Текущий архив: 2007.06.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
15-1179700796
programmist87
2007-05-21 02:39
2007.06.17
Пакеты времени исполнения


1-1176899250
webpauk
2007-04-18 16:27
2007.06.17
размер иконок


15-1179910817
Кевларвестов Семен
2007-05-23 13:00
2007.06.17
Почему-то не устанавливается BDS 2006


8-1159790519
Nickla
2006-10-02 16:01
2007.06.17
DSPack: ошибка при инициализации TSampleGraber как службу


1-1176973980
DelphiLexx
2007-04-19 13:13
2007.06.17
Test Case и Test Project Delphi2006