Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
15-1179940798
partizan
2007-05-23 21:19
2007.06.17
Уравнение axy+bx+cy = d


2-1180090630
SerMaxx
2007-05-25 14:57
2007.06.17
Работа с Access


2-1180437421
viper75
2007-05-29 15:17
2007.06.17
изменение параметрой на другой форме


15-1179657003
Bogdan1024
2007-05-20 14:30
2007.06.17
Счёт за сайт


15-1179470040
Igor_
2007-05-18 10:34
2007.06.17
Ek RTF Report для C++Builder





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский