이 델파이 소스와 연결되는 UNIX 상의 서버 프로세스가 있습니다.
UNIX에서 실행시키지 않고 델파이 상에서 실행을 시켜서 연결을 하고 싶은데
델파이에서 서버 프로세스를 실행시키는 방법을 잘 모르겠습니다.
더욱이 UNIX는 ID, pass를 묻는데 또 어떻게 하면 좋을지
UNIX상의 시스템 컴멘드를 어떻게 사용할 수 있는지 좀 가르쳐 주세요..
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls, ExtCtrls, ComCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
ClientSocket1: TClientSocket;
ErrTimer: TTimer;
edtIpaddr: TEdit;
edtPortno: TEdit;
Label1: TLabel;
Label2: TLabel;
lstvShow: TListView;
btExit: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ErrTimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
procedure btExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure AppError(Sender: TObject; EE: Exception);
end;
var
MainForm: TMainForm;
pCount : Integer;
pDate : string;
pTime : string;
pNode : string;
pInga : string;
pString : string;
implementation
uses connect;
{$R *.DFM}
procedure TMainForm.AppError(Sender: TObject; EE: Exception);
begin
// ShowMessage(EE.Message); //에러메세지
Application.ShowException(EE);
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
if ClientSocket1.Active then ClientSocket1.Close;
MainForm.lstvShow.Items.Clear;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Address := edtIpaddr.Text;
ClientSocket1.Port := StrToIntDef(edtPortno.Text, 0);
ConnectForm.ShowModal;
pCount := 0;
end;
procedure TMainForm.ErrTimerTimer(Sender: TObject);
begin
ErrTimer.Enabled:= False;
Application.MessageBox('접속에 실패했습니다. 서버의 응답이 없습니다.', '확인', MB_OK+MB_ICONINFORMATION);
ConnectForm.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := AppError;
end;
procedure TMainForm.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_RETURN then
begin
Edit1.SelStart:= 0;
Edit1.SelLength:= Length(Edit1.Text);
ClientSocket1.Socket.SendText(Edit1.Text + #13#10#0);
end;
end;
procedure TMainForm.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Edit1.Text := '[Connected]';
ErrTimer.Enabled:= False;
ConnectForm.Close;
end;
procedure TMainForm.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
Edit1.Text := '[Connecting..]';
end;
procedure TMainForm.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Edit1.Text := '[DisConnected]';
end;
procedure TMainForm.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Edit1.Text := '[Error]';
exit;
end;
procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
liCnt : Integer;
NodeP : TListItem;
pDate : string;
begin
NodeP := MainForm.lstvShow.Items.Add;
Edit1.Text := Socket.ReceiveText;
pCount := pCount + 1;
pDate := Copy(Trim(Edit1.Text), 0, 8);
pTime := Copy(Trim(Edit1.Text), 9, 6);
pNode := Copy(Trim(Edit1.Text), 15, 2);
pInga := Copy(Trim(Edit1.Text), 17, 8);
pString := Copy(Trim(Edit1.Text), 25, 9);
case StrToInt(pNode) of
11 : pNode := 'Jupiter';
12 : pNode := 'Hover';
13 : pNode := 'Magellan';
14 : pNode := 'Armada';
end;
NodeP.SubItems.Add( IntToStr(pCount) );
NodeP.SubItems.Add( pNode );
NodeP.SubItems.Add( pInga );
NodeP.SubItems.Add( pDate );
NodeP.SubItems.Add( pTime );
NodeP.SubItems.Add( pString );
if MainForm.lstvShow.Items.Count > 27 then
MainForm.lstvShow.Columns[07].Width := 176 // ListView ScrollBar 조절을
else MainForm.lstvShow.Columns[07].Width := 192; // 위해 마지막 Colum Width 조정
end;
procedure TMainForm.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
end;
procedure TMainForm.btExitClick(Sender: TObject);
begin
MainForm.Close;
end;
end.
방법은 두가지 정도로 나누어집니다.
1. windows와 Unix 에서 소켓프로그램을 개발해, Connection 한후
명령어 처리를 한다.
2. windows프로그램에서 Telnet 컴포넌트나, 소스를 이용해서
Unix Telnet 서비스에 ID,PASS를 자동로그인하게 한뒤
명령어 처리에 대한 것을 나타낸다(파싱해서 나타내면 더 좋음)
위 두가지 방법은 제가 다 구현해보았던 방법입니다...
참고하세요..