Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Внизкак насильно завершить соединения TIdTCPServer Найти похожие ветки
← →
pirat © (2004-03-18 23:58) [0]подскажите плз как насильно закрыть соединения TIdTCPServer не из его обработчика ? А то все время исключение вылезает при выходе :(
← →
pirat © (2004-03-18 23:58) [0]подскажите плз как насильно закрыть соединения TIdTCPServer не из его обработчика ? А то все время исключение вылезает при выходе :(
← →
Digitman © (2004-03-19 08:39) [1]IdTCPServer.Active := false;
если алгоритмы обработчиков событий объектов в составе IdTCPServer"а корректны, то никаких проблем быть не должно
← →
Digitman © (2004-03-19 08:39) [1]IdTCPServer.Active := false;
если алгоритмы обработчиков событий объектов в составе IdTCPServer"а корректны, то никаких проблем быть не должно
← →
pirat © (2004-03-19 10:26) [2]ээээ .. чего то я не совсем понимаю какие именно обработчики и как нужно описать.
Все время валится вот сюда
function TIdIOHandlerSocket.Recv(var ABuf; ALen: integer): integer;
begin
if Connected then
begin
Result := Binding.Recv(ABuf, ALen, 0);
end
else begin
raise EIdClosedSocket.Create(RSStatusDisconnected);
end;
end;
типа пытается что то принять когда соединения уже нету ?
← →
pirat © (2004-03-19 10:26) [2]ээээ .. чего то я не совсем понимаю какие именно обработчики и как нужно описать.
Все время валится вот сюда
function TIdIOHandlerSocket.Recv(var ABuf; ALen: integer): integer;
begin
if Connected then
begin
Result := Binding.Recv(ABuf, ALen, 0);
end
else begin
raise EIdClosedSocket.Create(RSStatusDisconnected);
end;
end;
типа пытается что то принять когда соединения уже нету ?
← →
Digitman © (2004-03-19 10:58) [3]ну да, разумеется ..
значит, где-то в коде одного из обработчиков (например, в OnExecute) уже после того, как Connected станет False (это как раз происходит при деактивации сервера), ты не проанализировав активность соединения пытаешься что-то читать из гнезда
приводи исх.тексты тех обработчиков, которые ты используешь
← →
Digitman © (2004-03-19 10:58) [3]ну да, разумеется ..
значит, где-то в коде одного из обработчиков (например, в OnExecute) уже после того, как Connected станет False (это как раз происходит при деактивации сервера), ты не проанализировав активность соединения пытаешься что-то читать из гнезда
приводи исх.тексты тех обработчиков, которые ты используешь
← →
pirat © (2004-03-20 00:12) [4]конечно примитивно, но я тока учусь :)
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var i : integer;
begin
if AThread.Connection.IOHandler.Connected then begin
case State of
waitLogin :
begin
ClientLogin := AThread.Connection.InputLn("",false);
AThread.Connection.WriteLn("Password");
State := waitPassword;
end;
waitPassword:
begin
ClientPassword := AThread.Connection.InputLn("",false);
if TestLogPass then begin
AThread.Connection.WriteLn("Access Granted");
State := waitCommand;
end else begin
AThread.Connection.WriteLn("Access Denied");
State := null;
AThread.Connection.DisconnectSocket;
end;
end;
waitCommand:
begin
ClientCommand := AThread.Connection.InputLn("",false);
if ClientCommand = "GetCountState" then
AThread.Connection.WriteLn(ClientsList.Items[ClientRecNo].SubItems[1])
else if pos("GetMoney",ClientCommand)<>0 then begin
i := PosEx("GetMoney",ClientCommand,0);
i := PosEx("=",ClientCommand,i) + 1;
AThread.Connection.WriteLn(copy(ClientCommand, i, length(ClientCommand)-i + 1));
end else
if ClientCommand = "Logout" then
AThread.Connection.DisconnectSocket;
end;
end;
end else
State := null;
end;
то есть, например, если посмотреть на call stack то исключение вылезает на ClientLogin := AThread.Connection.InputLn("",false);
то есть как я понимаю оно тормозит поток и ждет данных, а в это время сервер насильно вырубают... а как тогда узнать пришли ли вообще какие нить данные ???
← →
pirat © (2004-03-20 00:12) [4]конечно примитивно, но я тока учусь :)
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var i : integer;
begin
if AThread.Connection.IOHandler.Connected then begin
case State of
waitLogin :
begin
ClientLogin := AThread.Connection.InputLn("",false);
AThread.Connection.WriteLn("Password");
State := waitPassword;
end;
waitPassword:
begin
ClientPassword := AThread.Connection.InputLn("",false);
if TestLogPass then begin
AThread.Connection.WriteLn("Access Granted");
State := waitCommand;
end else begin
AThread.Connection.WriteLn("Access Denied");
State := null;
AThread.Connection.DisconnectSocket;
end;
end;
waitCommand:
begin
ClientCommand := AThread.Connection.InputLn("",false);
if ClientCommand = "GetCountState" then
AThread.Connection.WriteLn(ClientsList.Items[ClientRecNo].SubItems[1])
else if pos("GetMoney",ClientCommand)<>0 then begin
i := PosEx("GetMoney",ClientCommand,0);
i := PosEx("=",ClientCommand,i) + 1;
AThread.Connection.WriteLn(copy(ClientCommand, i, length(ClientCommand)-i + 1));
end else
if ClientCommand = "Logout" then
AThread.Connection.DisconnectSocket;
end;
end;
end else
State := null;
end;
то есть, например, если посмотреть на call stack то исключение вылезает на ClientLogin := AThread.Connection.InputLn("",false);
то есть как я понимаю оно тормозит поток и ждет данных, а в это время сервер насильно вырубают... а как тогда узнать пришли ли вообще какие нить данные ???
← →
Digitman © (2004-03-22 11:22) [5]
> а как тогда узнать пришли ли вообще какие нить данные
а зачем ? сеанс инф.обмена с клиентом уже прерван
← →
Digitman © (2004-03-22 11:22) [5]
> а как тогда узнать пришли ли вообще какие нить данные
а зачем ? сеанс инф.обмена с клиентом уже прерван
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c