Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.30;
Скачать: CL | DM;

Вниз

Пишу удаленную консоль   Найти похожие ветки 

 
slym   (2002-03-11 16:48) [0]

Удаленная консоль - типа Telnet.
На серваке перенаправляю I/O консоли в сокет,
на слиенте получаю I/O потоки и направляю в свою AllocConsole.
Типа не работает! I/O потоков 3! Inp/Out/Err
Как их в один сокетовый поток направить?
Потоки с файловыми хендлами!


 
Polevi   (2002-03-11 19:28) [1]

интересно взглянуть, как ты "перенаправляешь I/O консоли в сокет"


 
VuDZ   (2002-03-12 06:11) [2]

я бы на С++ сделал так - создаёся strinstream, в него пишуться данные, а из него, точнее из его буфера, пересылаются по сети.
для Делфи можно использовать TMemoryStream, наверно :>

лучши в общих чертах с небольшими выдержками кода, ракажи как ты это делаешь - создание стандартных потоков.

И не забывай, что сокеты - это буфферны устройства - они не признают потоков - всё работает через recv(), send()

Т.е. тебе надо читать данные из консоли и отправлять их по символьно. скорее всего или за некий промежуток времени - 100мс, например


 
paul_shmakov   (2002-03-12 15:15) [3]

делается это следующим образом:
1. устанавливаем соединение сокетное соединение

var
s: SOCKET;
begin
s := socket(...);
...
connect(s, ...);

2. создаем pipe-ы

var
sa: SECURITY_ATTRIBUTES;
hServerInputPipe, hNetworkRecvPipe: HANDLE;
hServerOutputPipe, hNetworkSendPipe: HANDLE;
begin
sa.bInheritHandle := true;
sa.lpSecurityDescriptor := nil;
sa.nLength := sizeof(SECURITY_ATTRIBUTES);

// server input <- network recv
if CreatePipe(hServerInputPipe, hNetworkRecvPipe, @sa, 0) = 0 then
begin
closesocket(s);
Exit;
end;

// server output -> network send
if CreatePipe(hNetworkSendPipe, hServerOutputPipe, @sa, 0) = 0 then
begin
CloseHandle(hServerInputPipe);
CloseHandle(hNetworkRecvPipe);
closesocket(s);
Exit;
end;

3. запускаем приложение

var
pi: PROCESS_INFORMATION;
si: STARTUPINFO;
begin
FillChar(@si, sizeof(si), Chr(0));

si.cb := sizeof(si);
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW or STARTF_FORCEOFFFEEDBACK;

si.wShowWindow := SW_HIDE;
si.hStdError := hServerOutputPipe;
si.hStdInput := hServerInputPipe;
si.hStdOutput := hServerOutputPipe;

if CreateProcess(nil, FileName, nil, nil, true, CREATE_SEPARATE_WOW_VDM, nil, nil, @si, @pi) = 0 then
begin
CloseHandle(hServerInputPipe);
CloseHandle(hNetworkRecvPipe);
CloseHandle(hServerOutputPipe);
CloseHandle(hNetworkSendPipe);
closesocket(s);
Exit;
end;

4. а теперь просто пересылаем данные из пайпов в сокет, а из сокета в пайпы.

var
dwLen,dwBytes: DWORD;
rfds: fd_set;
tm: TIMEVAL;
Buffer: PChar;
begin
while true do
begin
Sleep(20);

FD_ZERO(rfds);
FD_SET(s, rfds);

tm.tv_sec := 0;
tm.tv_usec := 0;

if select(0, rfds, nil, nil, @tm) > 0 then
begin
if FD_ISSET(s, rfds) then
begin
ioctlsocket(s, FIONREAD, @dwLen);
if dwLen <= 0 then
begin
CloseHandle(hNetworkSendPipe);
CloseHandle(hServerOutputPipe);
CloseHandle(hNetworkRecvPipe);
CloseHandle(hServerInputPipe);
closesocket(s);
Exit;
end;

GetMem(Buffer, dwLen);
if Assigned(Buffer) then
begin
dwLen := recv(s, Buffer^, dwLen, 0);
if dwLen > 0 then
WriteFile(hNetworkRecvPipe, Buffer^, dwLen, @dwBytes, nil);
FreeMem(Buffer);
end;
end;
end;

PeekNamedPipe(hNetworkSendPipe, nil, 0, nil, @dwLen, nil);
if dwLen > 0 then
begin
GetMem(Buffer, dwLen);
if Assigned(Buffer) then
begin
ReadFile(hNetworkSendPipe, Buffer^, dwLen, @dwBytes, nil);
send(s, Buffer^, dwBytes, 0);
FreeMem(Buffer);
end;
end;

// выходим из цикла, когда приложение закрывается
if WaitForSingleObject(pi.hProcess, 0) <> WAIT_TIMEOUT then Break;
end;

5. закрываем все, что открыли

CloseHandle(hNetworkSendPipe);
CloseHandle(hServerOutputPipe);
CloseHandle(hNetworkRecvPipe);
CloseHandle(hServerInputPipe);

closesocket(s);


примерно техника такая. я прошу прощения, я, возможно, ошибся в коде, так как переводил его на ходу с C в паскаль.


 
slym   (2002-03-23 18:32) [4]

Ну ты наваял, бл% разбираться долго...
Спасибо, проверю
Да! А не будет ли проблем?
Ты один пайп на два потока натянул (на оут и ерр)?
Я смотрел они отдельные потоки с разными хендлами!


 
slym   (2002-03-23 18:44) [5]

И если не трудно скинь Сюшный код на мыло или дай линк на него...


 
paul_shmakov   (2002-03-28 23:05) [6]

с тем, что out и err перенаправлены в один пайп - это все нормально. при обычном запуске консольных приложений out и err тоже перенаправляются в одно место.

ну а примеров много. например, в back orifice 2k есть такой модуль
http://sourceforge.net/projects/bo2k/



Страницы: 1 вся ветка

Текущий архив: 2002.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
3-97142
Great DAN
2002-05-05 14:19
2002.05.30
Все еще по основам Paradox7


7-97434
pvn
2002-03-06 05:57
2002.05.30
народ, помогите пожалуйста!!!


3-97212
Mikeee
2002-05-10 10:36
2002.05.30
Из ListBox-а в таблицу на SQL-сервере...


6-97374
Dialogig
2002-03-20 17:50
2002.05.30
Ну очень нужна помощь!


1-97252
ilXAM
2002-05-20 11:42
2002.05.30
FastReport? howto...