Форум: "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.47 MB
Время: 0.004 c