Форум: "Сети";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
ВнизКак обработать ошибку при отключении клиента? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c