Форум: "Сети";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c