Главная страница
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.02 c
2-1179988065
Marat
2007-05-24 10:27
2007.06.17
Проблема с запросом


15-1179475698
codecleaner
2007-05-18 12:08
2007.06.17
О пользе стандартов...


11-1162491929
karl
2006-11-02 21:25
2007.06.17
snow (schnee)


15-1179784204
Германн
2007-05-22 01:50
2007.06.17
Спам на форуме


2-1179820641
RusTim
2007-05-22 11:57
2007.06.17
Как руссифицировать ActionManager