Проблема: есть несколько телнет серверов. Если один из них недоступен - надо чтоб программа переключилась на другой.
Что не получается: если обращаемся к нерабочему серверу, а потом к рабочему, то у рабочего сервера выскакивает ошибка 100049, при повторном обращении к рабочему - подключение !
Пример тестового кода
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ClientOnConnected(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientOnConnecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientOnDisconnected(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientOnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: integer);
procedure ClientOnRead(Sender: TObject; Socket: TCustomWinSocket);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TelnetSocket: TClientSocket;
implementation
{$R *.dfm}
//on connecting to server process
procedure TForm1.ClientOnConnecting(Sender: TObject; Socket: TCustomWinSocket);
var
S: string;
begin
if TelnetSocket.Host = '' then
S := TelnetSocket.Address
else
S := TelnetSocket.Host;
Memo1.Lines.Add('Connecting to server [' + S + ']');
end;
//on connected to server process
procedure TForm1.ClientOnConnected(Sender: TObject; Socket: TCustomWinSocket);
var
S: string;
begin
if TelnetSocket.Host = '' then
S := TelnetSocket.Address
else
S := TelnetSocket.Host;
Memo1.Lines.Add('Server of connected : ' + S);
TelnetSocket.Socket.SendText('RX4HX' + #10 + #13);
end;
//on disconnect from server
procedure TForm1.ClientOnDisconnected(Sender: TObject; Socket: TCustomWinSocket);
var
S: string;
begin
if TelnetSocket.Host = '' then
S := TelnetSocket.Address
else
S := TelnetSocket.Host;
Memo1.Lines.Add('Disconnected from server [' + S + ']');
end;
//on read from socket
procedure TForm1.ClientOnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Socket.ReceiveText);
end;
//on client error
procedure TForm1.ClientOnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: integer);
var
ErrStr: string;
begin
case ErrorEvent of
eeGeneral: ErrStr := 'General Error';
eeSend: ErrStr := 'Send Error';
eeReceive: ErrStr := 'Receive Error';
eeConnect: ErrStr := 'Connect Error';
eeDisconnect: ErrStr := 'Disconnect Error';
eeAccept: ErrStr := 'Accept Error';
eeLookup: ErrStr := 'Lookup Error';
end;
Memo1.Lines.Add('Error Type : ' + ErrStr +
', Error Code : ' + IntToStr(ErrorCode));
ErrorCode := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Создаем сокет телнета
TelnetSocket := TClientSocket.Create(Self);
TelnetSocket.OnConnecting := ClientOnConnecting;
TelnetSocket.OnConnect := ClientOnConnected;
TelnetSocket.OnDisconnect := ClientOnDisconnected;
TelnetSocket.OnRead := ClientOnRead;
TelnetSocket.OnError := ClientOnError;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if TelnetSocket.Active then
TelnetSocket.Socket.Close;
TelnetSocket.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TelnetSocket.Host := '1yu1exy.org';
TelnetSocket.Port := 8000;
TelnetSocket.Active := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TelnetSocket.Host := 'rn6bn.73.ru';
TelnetSocket.Port := 23;
TelnetSocket.Active := True;
end;
end.
Форма - на ней 2 кнопки и мемо.
Button1 - с несуществующим адресом, Button2 - с работающим.
1.Нажмите на Button2 - произойдет соединение с сервером.
2.Затем нажмите на Button1 - выдаст ошибку Lookup server.
3.Нажмите опять на Button2 - выдаст ошибку 100049
4. и опять на Button2 - произойдет соединение.
Не пойму, почему сразу не происходит соединение на шаге 3?