![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.