如何将子进程的stdout(stderr)重定向到winapi中的socket?

时间:2011-03-18 16:17:15

标签: c++ c winapi client-server

我想创建客户端服务器程序,其中服务器是主进程,客户端是子进程。在客户端我想将stdout和stderr子进程流重定向到套接字。在服务器中我想从套接字文件描述符中获取并从中读取。在互联网上有很多关于套接字的信息,但是我没有通过windows的套接字找到任何父子IPC的例子。

如果可能的话,请在这里发布一个解决我的问题(或部分)的简单代码。链接到msdn也可以提供帮助,但我想我已经在那里查找了所有内容而没有找到我想要的内容。

P.S。请不要建议管道。我想通过套接字来做到这一点。

4 个答案:

答案 0 :(得分:1)

看看Netcat如果你可以使用它,或者在sourceforge上的某个地方找到windows版本的源代码,可能这可以使用管道拦截stdin / stdout并发送和读取带有这些管道的套接字。< / p>

我知道你说过没有管道,但是没有其他方法可以只使用Windows API。您至少可能需要以下内容:

CreatePipe

WriteFile

ReadFile

答案 1 :(得分:0)

这就像试图在火灾开始后扑灭火灾时,你应该首先尝试防火。

由于您是server.exe和client.exe的宣称作者,而不是尝试捕获stdout / stderr,并在此时将其重定向到套接字,您应该重新设计客户端,以便您捕获发往stdout的文本,然后转到stdout。

此时,如果您愿意,可以将输出文本发送到BOTH标准输出和插座。

编辑:忽略上半部分,因为您后来说您不是客户的作者。

好的,第二次尝试:

由于您使用“假”客户端产生“真实”客户端,为什么不在“假”客户端的stdin上拦截“真实”客户端的stdout(打开管道)。然后让“假”客户端在套接字上发回数据..

答案 2 :(得分:0)

假设:

server talks with client

client spawns child

以下是MSDN创建Child Process with Redirected IO

的示例

不幸的是,您必须使用管道将IO从子程序获取到客户端。关于它没有ifs,ands或buts。

然后您可以使用以下内容将信息提供给服务器:

客户端通信循环:

while ( /* files are open */ ) { 
    DWORD dwRead;  
    CHAR chBuf[1024]; memset(chBuf, 0, 1024); /* always initialize your memory! */
    BOOL bSuccess = FALSE;

    /* read data from child pipe */
    ReadFromFile(g_hSChildStd_IN_Rd, chBuf, 1024, &dwRead, NULL );      

    /* send data via windows sockets to the remote server connection 
       represented by serverSocketHandle */
    send(serverSocketHandle, chBuf, dwRead, 0);
}

您的客户端实际上成为STDOUT / ERR管道和TCP套接字之间的转换器。

答案 3 :(得分:0)

我知道支持这一点的唯一环境是Cygwin。它们是开源的 - 尝试仔细阅读他们的想法代码。不过,它确实是非常令人讨厌的,就像抽充螺纹一样。