![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как насильно завершить соединения TIdTCPServer [D7, WinXP]
pirat © (2004-03-18 23:58:00)подскажите плз как насильно закрыть соединения TIdTCPServer не из его обработчика ? А то все время исключение вылезает при выходе :(
Digitman (2004-03-22 11:22:00) [1]
> а как тогда узнать пришли ли вообще какие нить данные
а зачем ? сеанс инф.обмена с клиентом уже прерван
pirat (2004-03-20 00:12:00) [2]конечно примитивно, но я тока учусь :)
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-19 10:58:00) [3]ну да, разумеется ..
значит, где-то в коде одного из обработчиков (например, в OnExecute) уже послетого, как Connected станет False (это как раз происходит при деактивации сервера), ты не проанализировав активность соединения пытаешься что-то читать из гнезда
приводи исх.тексты тех обработчиков, которые ты используешь
pirat (2004-03-19 10:26:00) [4]ээээ .. чего то я не совсем понимаю какие именно обработчики и как нужно описать.
Все время валится вот сюда
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 08:39:00) [5]IdTCPServer.Active := false;
если алгоритмы обработчиков событий объектов в составе IdTCPServer'а корректны, то никаких проблем быть не должно