Q&A

  • Unix 와 델파이 통신프로그램 중 이해 안되는 부분이 있어서,.
//사용법 은 아래와 같습니다.
// 프로그램은 정확하게  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.
2  COMMENTS
  • Profile
    최용일 2002.04.10 23:14
    안녕하세요. 최용일입니다.

    흠... 배열등을 이용해서 한꺼번에 읽는 거나 루프문을 써서 1바이트씩 여러번에 걸쳐서 읽는 거나 똑같은 건데요...

    ReceiveBuf라는 메소드가 TCP프로토콜로 들어온 데이터를 읽습니다.

    만일 100바이트가 들어왔다면 배열을 써서 한꺼번에 100바이트를 읽어도 되고,

    for나 while루프를 써서 1바이트씩 100번 읽어도 됩니다.

    어떤식으로 하든 그건 프로그래머 맘이겠죠...

    ^^ 항상 즐코하세요...

  • Profile
    문상철 2002.04.11 01:13
    흠.. 1byte 씩 읽는다.. 그런뜻이었군요.
    너무 쉬운걸 어렵게 생각했군요.

    답변 정말 고맙습니다.