Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.10;
Скачать: CL | DM;

Вниз

Как обработать ошибку при отключении клиента?   Найти похожие ветки 

 
NeyroSpace ©   (2006-11-25 19:14) [0]

Неблокирующий сокет, TCP протокол. К серверу подключается клиент, ему отдельный поток передает данные. Данные записываются в сокет в 2а приема 1 - небольшой заголовок, 2 - данные (несколько килобайт). При закрытии клиента, на сервере выскакивает List index out of bound (0) Т.е. вроде как сервер не может записать данные в сокет с индексом i. (но я же проверяю, что соединение еще есть!)
Если передавать только заголовок, то клиент отключается без ошибок. Т.е. исключение наступает при 2м вызове SendBuf в момент передачи данных.
Подскажите как обработать данную ошибку?

SendingBufferFrames: TList - тут хранятся указатели на кусочки данных (заголовок, данные, заголовок, данные....)

procedure TSenderThread.Execute;
var i: integer;
   pFrame: PFramePacket;
begin
While not Terminated do
 begin
 if Form1.ServerSocket1.Socket.ActiveConnections > 0 then
   begin
     if SendingBufferFrames.Count >= 2 then
       begin
       for i := 0 to Form1.ServerSocket1.Socket.ActiveConnections - 1 do
         begin
         try
         if Form1.ServerSocket1.Socket.Connections[i].Connected = true then
           begin
           Form1.ServerSocket1.Socket.Connections[i].SendBuf(Pointer(SendingBufferFrames.It ems[0])^, sizeof(TFramePacket));//заголовок
           pFrame := Pointer(SendingBufferFrames.Items[0]);
           Form1.ServerSocket1.Socket.Connections[i].SendBuf(Pointer(SendingBufferFrames.It ems[1])^, pFrame.Size);//данные

           FreeMem(SendingBufferFrames.Items[0]);//освобождаем память под заголовок
           SendingBufferFrames.Delete(0);
           FreeMem(SendingBufferFrames.Items[0]);//освобождаем память под данные
           SendingBufferFrames.Delete(0);
           end;
         except
           on e: Exception do
             begin
ошибка перехватывается в этом месте
             end;
         end;
         end;
       end;
   end;
 end;
end;


 
Eraser ©   (2006-11-25 19:21) [1]

>           on e: Exception do

лишнее.


 
NeyroSpace ©   (2006-11-25 19:59) [2]

А что делать? Если убрать Try Except b запускать из среды Delphi, то после появления ошибки можно продолжить работу сервера, а если сервер запускать из ехе, то он закрывается...


 
NeyroSpace ©   (2006-11-25 20:37) [3]

Млин! Если запускать не тот ехешник он и и не будет реагировать на перекомпиляцию))))))
Сорри все заработало, вопрос снят.


 
Eraser ©   (2006-11-25 22:02) [4]

> [2] NeyroSpace ©   (25.11.06 19:59)
> А что делать? Если убрать Try Except b

я не говорил убирать try..except )

> on e: Exception do

какой смысл в этой конструкции?


 
Сергей М. ©   (2006-11-27 08:12) [5]


> NeyroSpace ©   (25.11.06 19:14)


Так делать недопустимо.
Список ActiveConnections не потокобезопасен.


 
Rouse_ ©   (2006-11-27 23:02) [6]

Все начиная от сих:
Form1.ServerSocket1.Socket.ActiveConnections
не потокобезопасно...


 
Сергей М. ©   (2006-11-28 08:48) [7]

К тому же SendBuf() - это функциональный, а не процедурный метод. Тебе это о чем-то говорит ?



Страницы: 1 вся ветка

Текущий архив: 2007.06.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1179841159
Sonia
2007-05-22 17:39
2007.06.10
Как показать на экран форму вперед главной


15-1179562205
alex_drob
2007-05-19 12:10
2007.06.10
Как записать числа в QBasic


9-1153070015
Зм1й
2006-07-16 21:13
2007.06.10
"Вертикальная синхронизация"


15-1179314917
Галинка
2007-05-16 15:28
2007.06.10
ищу сериалы производства Кореи


15-1178898672
Ringo
2007-05-11 19:51
2007.06.10
Женюсь, ей-богу женюсь, честное, благородное слово!(Паниковский).