Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
1-97261
VicV
2002-05-17 23:00
2002.05.30
Кто нибудь знает, как сделать отчет в Еxcel?


6-97378
legioner
2002-03-19 13:14
2002.05.30
Firewall


1-97324
agrig
2002-05-19 18:27
2002.05.30
Какой ModalResult при закрытии по Alt+F4 или кнопке с крестом?


3-97203
Reticent
2002-05-07 18:22
2002.05.30
Банк данных


7-97445
sj
2002-03-01 18:22
2002.05.30
Формирование ресурсов сообщений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский