![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обработать ошибку при отключении клиента? [D5]
NeyroSpace © (2006-11-25 19:14:00)Неблокирующий сокет, 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;
Сергей М. (2006-11-28 08:48:00) [1]К тому же SendBuf() - это функциональный, а не процедурный метод. Тебе это о чем-то говорит ?
Rouse_ (2006-11-27 23:02:00) [2]Все начиная от сих:
Form1.ServerSocket1.Socket.ActiveConnections
не потокобезопасно...
Сергей М. (2006-11-27 08:12:00) [3]
> NeyroSpace © (25.11.06 19:14)
Так делать недопустимо.
Список ActiveConnections не потокобезопасен.
Eraser (2006-11-25 22:02:00) [4]> [2] NeyroSpace © (25.11.06 19:59)
> А что делать? Если убрать Try Except b
я не говорил убирать try..except )
> on e: Exception do
какой смысл в этой конструкции?
NeyroSpace (2006-11-25 20:37:00) [5]Млин! Если запускать не тот ехешник он и и не будет реагировать на перекомпиляцию))))))
Сорри все заработало, вопрос снят.
NeyroSpace (2006-11-25 19:59:00) [6]А что делать? Если убрать Try Except b запускать из среды Delphi, то после появления ошибки можно продолжить работу сервера, а если сервер запускать из ехе, то он закрывается...
Eraser (2006-11-25 19:21:00) [7]> on e: Exception do
лишнее.