IdTelnet и cmd

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Ответить
RaDex
Сообщения: 4
Зарегистрирован: 25 июн 2007, 06:58

25 июн 2007, 07:15

вот допустим я написал телнет клиент и сервер IdTelnet (indy-пример) тоесть сервер отвечает сообщениями клиенту какие укажешь (на сообщение ТАКОЕ-ТО ответить ТАК-ТО), но вот никак немогу понять как организовать через этот клиент сервер работу с командной строкой (cmd), чтобы на сервере команды командной строки (cmd) выполнялись :( может кто подскажет ?
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

25 июн 2007, 17:39

Если правильно понимаю, то использовать надо команду telnet
RaDex
Сообщения: 4
Зарегистрирован: 25 июн 2007, 06:58

28 июн 2007, 06:53

Может кто на дельфи знает пример как передать дос-окну сообщение и принять результат в свою программу ?
Или хотя бы как передавать данные из своей программы в дос-окно, чтобы не одноразово, а подерживать сеанс короче что-то типа терминала с cmd
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

29 июн 2007, 08:42

Можно перехватить ввод/вывод консольного приложения.
Я делаю это так:

[syntax="delphi"] var
hOutRead, hOutWrite: THandle;
hInRead, hInWrite: THandle;[/syntax]
Создание пайпов для передачи данных и запуск нити чтения:[syntax="delphi"]var
tid: Cardinal;
sa: TSecurityAttributes;
begin
ZeroMemory(@sa, SizeOf(TSecurityAttributes));
sa.nLength := SizeOf(TSecurityAttributes);
sa.bInheritHandle := True;

if not CreatePipe(hOutRead, hOutWrite, @sa, 0) then
Raise Exception.Create('Can''t create pipe');

if not CreatePipe(hInRead, hInWrite, @sa, 0) then
Raise Exception.Create('Can''t create pipe');

CreateThread(nil, 0, @ReadThread, Self, 0, tid);
end;[/syntax]
Нить чтения данных: [syntax="delphi"]function ReadThread(Param: TForm1): Integer; stdcall;
var
temp: array[0..1023] of char;
dwBytesRead: Cardinal;
begin
while not Application.Terminated do
begin
ZeroMemory(@temp, 1024);
ReadFile(hOutRead, temp, 1024, dwBytesRead, nil);
OemToAnsiBuff(@temp, @temp, dwBytesRead);
// в буфере данные, выведенные консольным приложением.
end;
Result := 0;
end;[/syntax]
запуск процесса с переопределенными стандартными устройствами ввода/вывода:[syntax="delphi"]var
si: TStartupInfo;
pi: TProcessInformation;
filen: String;
begin
with TOpenDialog.Create(Self) do
try
if not Execute then Exit;
if not FileExists(FileName) then Exit;
filen := FileName;
finally
Free;
end;
ZeroMemory(@si, SizeOf(TStartupInfo));
si.hStdInput := hInRead;
si.hStdOutput := hOutWrite;
si.hStdError := hOutWrite;
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USECOUNTCHARS or STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
si.dwXCountChars := 1;
si.dwYCountChars := 1;

CreateProcess(nil, PChar(filen), nil, nil, True, 0, nil, nil, si, pi);

repeat
Application.ProcessMessages;
until (WaitForSingleObject(pi.hProcess, 100) <> WAIT_TIMEOUT) or Application.Terminated;

CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;[/syntax]
посылка строки консольному приложению (оно думает, что его набрали на клавиатуре ;) [syntax="delphi"]var
dwBytesRead: CArdinal;
s: String;
begin
s := edit1.Text + #13#10;
WriteFile(hInWrite, s[1], Length(s), dwBytesRead, nil);
edit1.Text := '';
end;[/syntax]
ну и в конце закроем хендлы:[syntax="delphi"] CloseHandle(hOutWrite);
CloseHandle(hOutRead);[/syntax]

P.S. выдрано с живого проекта, так что кое-что возможно придется подредактить.
С уважением, Lost Angel...
RaDex
Сообщения: 4
Зарегистрирован: 25 июн 2007, 06:58

29 июн 2007, 23:06

Кто нибудь работал с TIdTelnetServer, вот к примеру если взять этот код

Код: Выделить всё

procedure TMainForm.IdTelnetServer1Execute(AThread: TIdPeerThread);
var
str : string;
begin
with AThread.Connection do
begin
Write('shell>');
str:=InputLn('');
ShellExecute(handle, 'Open', 'cmd.exe', Pchar('/c '+str), '', SW_HIDE);
WriteLn(str);
if (str='exit') or (str='logout') then
Disconnect; 
end;
end; 
можно ли как нибудь принимать (InputLn) или передавать (WriteLn) данные не в процедуре IdTelnetServer1Execute, а в какойнибудь другой даже в той же FormCreate или в какой нибудь другой или вообще в другом потоке ?
Вообще как нибудь ещё можно передать или принять данные от клиента кроме как в IdTelnetServer1Execute
Это очень нужно чтобы нормальный терминал создать
Ответить