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

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

Socket.ReceiveBuf ломается с ИС [D7, WinXP]


Diamond ©   (2006-11-27 18:18:00) 

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


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

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


Diamond   (2006-11-29 13:33:00) [2]

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


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


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


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


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


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


savva   (2006-11-27 20:57:00) [4]


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

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

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

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


Diamond   (2006-11-27 18:38:00) [5]

>Орион
да, все в порядке. потому что я пакеты маленькие и читаю я по 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;
далее идет обработка полученной строки


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

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


Diamond   (2006-11-27 18:28:00) [7]

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

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


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

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


Наверх

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