//사용법 은 아래와 같습니다.
// 프로그램은 정확하게 ls -l 명령을 파일로 저장합니다.
RExec( ip, id,password, 'cd /etc/; ls -l',
'c:tempux.txt');
밑에 소스중 이해 안되는 부분이 있습니다.
--------------------------------------------
unit Rexecs;
interface
uses
Windows,Forms;
function RExec(const HostIP : string; const UserID : string;
const Password : string; const Command : string;
const ResultFilename : string) : boolean;
implementation
uses ScktComp;
function RExec(const HostIP : string; const UserID : string;
const Password : string; const Command : string;
const ResultFilename : string) : boolean;
var TCP : TClientSocket;
i : integer;
TxOut : File;
Buffer,Cr,Lf : byte;
Failed : boolean;
begin
Failed := true; // Assume initial error state
Cr := 13; // Carriage Return Char
Lf := 10; // Line Feed Char
TCP := TClientSocket.Create(nil);
try
TCP.Address := HostIP;
TCP.ClientType := ctBlocking;
TCP.Port := 512; // REXEC port
TCP.Open;
// Give time to connect
for i := 1 to 500 do if not TCP.Active then Sleep(100) else break;
// If TCP opened OK then send the command to host
// and write results to specified file
if TCP.Active then begin
AssignFile(TxOut,ResultFileName);
Rewrite(TxOut,1);
TCP.Socket.SendText('0' + #0);
TCP.Socket.SendText(UserID + #0);
TCP.Socket.SendText(Password + #0);
TCP.Socket.SendText(Command + #0);
TCP.Socket.SendText(#13);
Sleep(20); // Give a gap to respond
//--------------------------------------------- 여기서 부터...
// buffer 변수 타입이 배열이 아닌 그냥 byte 입니다.
// 제가 알기로는 buffer : array[0..1024] of byte 또는 char
// 이렇게 해서 원격에 있는 내용을 버퍼에 갖고 와서 저장하는걸로 알고 있습니다.
// 아래의 내용이 어떻게 해서 원격에 있는 내용을 갖고와 파일로
// 쓰는지 알고 싶습니다.
//
// --------------------------------------------------------------
while (TCP.Socket.ReceiveBuf(Buffer,1) <> 1) do
Application.ProcessMessages;
// Write host byte stream to file ,
while TCP.Socket.ReceiveBuf(Buffer,1) = 1 do begin
if (Buffer = 10) then begin
BlockWrite(TxOut,Cr,1);
BlockWrite(TxOut,Lf,1);
end
else
BlockWrite(TxOut,Buffer,1);
end;
//--------------------------------------------------여기까지
TCP.Close;
CloseFile(TxOut);
Failed := false;
end;
finally
TCP.Free;
end;
Result := not Failed;
end;
end.
흠... 배열등을 이용해서 한꺼번에 읽는 거나 루프문을 써서 1바이트씩 여러번에 걸쳐서 읽는 거나 똑같은 건데요...
ReceiveBuf라는 메소드가 TCP프로토콜로 들어온 데이터를 읽습니다.
만일 100바이트가 들어왔다면 배열을 써서 한꺼번에 100바이트를 읽어도 되고,
for나 while루프를 써서 1바이트씩 100번 읽어도 됩니다.
어떤식으로 하든 그건 프로그래머 맘이겠죠...
^^ 항상 즐코하세요...