안녕하세요..
제가 텔넷창을 만들고 싶은데 델파이 4.0에서 인터넷 컴포넌트를
봐도 텔넷에 대한 것은 없는 것 같더군요..
못 찾아서 그럴수도 있지만요.. ^^;
만약 그런거라면 어떤것인지 아시는분 있으시면 답장 좀 남겨주세요.
그게 아니고 다른 방법을 통해서만 가능하다면 그것을 알려주었으면
고맙겠습니다. 여기 telnet을 검색해서 찾아 보았는데..
ICS의 TNemulvt와 winshoes가 있던데요..
이거면 되는지요..
자세히 알려주시면 대단히 감사하겠으나.. 대강 이라도 무엇을
사용하면 된다는 방향이라도 제시해 주시면 어떻게 해보겠는데..
첨부터 막히네요.. ㅜㅜ
델파이로 작업을 아직 많이 못해봐서.. 막히는 부분이 많네요..
아시는분 답장 부탁드립니다.
수고하십시요. ^^
그를 처리해줘야 하지만.. 그냥 TClientSocket을 써주면 무난히 만들 수 있죠
아래 프로그램은 제가 예전에 같은 질문을 받았을때 예제로 만들었던 간단한
텔넷 프로그램입니다. 참고하세요...
TMainForm = class(TForm)
Screen: TMemo;
btConnect: TButton;
btDisconnect: TButton;
edHost: TEdit;
ClientSocket: TClientSocket;
Label1: TLabel;
위대로 컴포넌트 만드시고 이름 설정하는거 잊지 마시고요..
unit Telnet_main;
interface
uses
Winsock,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp;
const
IAC = #255;
DONT = #254;
DOO = #253;
WONT = #252;
WILL = #251;
SB = #250;
SE = #240;
TELOPT_ECHO = #1;
TELOPT_TTYPE = #24;
Num = '0123456789';
Alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
type
TMainForm = class(TForm)
Screen: TMemo;
btConnect: TButton;
btDisconnect: TButton;
edHost: TEdit;
ClientSocket: TClientSocket;
Label1: TLabel;
procedure btConnectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btDisconnectClick(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ScreenKeyPress(Sender: TObject; var Key: Char);
procedure ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
private
public
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
procedure TMainForm.FormCreate(Sender: TObject);
begin
btDisconnect.Enabled := false;
end;
procedure TMainForm.btConnectClick(Sender: TObject);
var
i, port: integer;
host: string;
begin
host := edHost.Text;
i := Pos(':', host);
if i > 0 then begin // 포트번호가 지정돼있으면
port := StrToInt(copy(host, i + 1, maxint));
host := copy(host, 1, i - 1);
end else port := 23; // Telnet 프로토콜의 port번호
ClientSocket.Host := host;
ClientSocket.Port := port;
ClientSocket.Open;
btConnect.Enabled := false;
edHost.Enabled := false;
edHost.Color := clBtnFace;
end;
procedure TMainForm.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
btDisconnect.Enabled := true;
Screen.SetFocus;
end;
procedure TMainForm.btDisconnectClick(Sender: TObject);
begin
ClientSocket.Close;
edHost.SetFocus;
end;
procedure TMainForm.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
btDisconnect.Enabled := false;
btConnect.Enabled := true;
edHost.Enabled := true;
edHost.Color := clWindow;
if Sender <> nil then ShowMessage('접속이 끊겼네용..');
end;
procedure TMainForm.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
case ErrorCode of
WSAENETDOWN: ShowMessage('오류: 네트웍 작동불능');
WSAECONNREFUSED: ShowMessage('오류: 연결이 거부됨');
WSAENETUNREACH: ShowMessage('오류: 닿지않는 호스트');
WSAETIMEDOUT: ShowMessage('오류: 연결시간 초과');
else ShowMessage(Format('연결 오류(코드 %d)', [ErrorCode]));
end;
ClientSocketDisconnect(nil, ClientSocket.Socket);
ErrorCode := 0;
end;
procedure TMainForm.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s, t, reply: string;
i, j, l: integer;
begin
l := Socket.ReceiveLength;
SetLength(s, l); // 버퍼 공간 확보
Socket.ReceiveBuf(s[1], l);
reply := '';
i := 1;
s := s + #0#0#0#0#0#0#0#0; // i가 l보다 넘을때를 대비해서...
while i <= l do begin
if s[i] = IAC then begin // 텔넷 명령이 오면...
j := i;
inc(i);
if s[i] = SB then begin
inc(i);
if s[i] = TELOPT_TTYPE then // 터미날 타입 요구가 들어오면
// 우리는 vt100을 쓴다네...
reply := reply + IAC + SB + TELOPT_TTYPE + #0 + 'vt100' + IAC + SE;
repeat inc(i); until ((s[i - 1] = IAC) and (s[i] = SE)) or (i > l);
end else if s[i] = DOO then begin
// 우리는 ECHO와 TTYPE에 대해서만 취급하고 수행할꺼라네...
inc(i);
if (s[i] = TELOPT_ECHO) or (s[i] = TELOPT_TTYPE) then
reply := reply + IAC + WILL + s[i]
else reply := reply + IAC + WONT + s[i];
end else if s[i] = DONT then begin
// 하지말라면 안하고
inc(i);
reply := reply + IAC + WONT + s[i]
end else if s[i] = WILL then begin
// 한다면 시키고
inc(i);
reply := reply + IAC + DOO + s[i]
end else if s[i] = WONT then begin
// 하지않는다면 시키지 말지어다..
inc(i);
reply := reply + IAC + DONT + s[i]
end;
// 텔넷 명령은 출력에 포함시키지 않도록 빼야겠죠?
s := copy(s, 1, j - 1) + copy(s, i + 1, maxint);
l := l - (i - j + 1);
i := j;
end else if s[i] = #27 then begin // 안시닷!
j := i;
inc(i);
if s[i] = '[' then begin
repeat inc(i) until Pos(s[i], Alphabet) > 0;
if (s[i] = 'J') then Screen.Lines.Clear; // 화면지