Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将子进程的stdout(stderr)重定向到winapi中的套接字?_C++_C_Winapi_Client Server - Fatal编程技术网

C++ 如何将子进程的stdout(stderr)重定向到winapi中的套接字?

C++ 如何将子进程的stdout(stderr)重定向到winapi中的套接字?,c++,c,winapi,client-server,C++,C,Winapi,Client Server,我想制作一个客户端-服务器程序,其中服务器是主进程,客户端是子进程。在客户端中,我想将子进程的stdout和stderr流重定向到套接字。在服务器中,我想从套接字文件描述符中创建并读取。在互联网上有很多关于套接字的信息,但我还没有找到任何通过windows套接字实现父子IPC的例子 如果可能,请在这里张贴一个简单的代码,解决我的问题(或部分)。指向msdn的链接也有帮助,但我想我已经查找了那里的所有内容,但没有找到我想要的 另外,请不要建议使用管道。我想通过套接字来实现这一点。看看您是否可以使用

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

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

另外,请不要建议使用管道。我想通过套接字来实现这一点。

看看您是否可以使用它,或者在sourceforge上的某个地方找到windows版本的源代码。可能这可以使用管道来截取stdin/stdout,并通过这些管道发送到套接字并从中读取

我知道你说过没有管道,但只有windows API没有其他方法可以做到这一点。您可能至少需要以下内容:


这就像在火灾发生后试图扑灭火灾一样,而你首先应该努力防止火灾的发生

由于您是server.exe和client.exe的声明作者,而不是试图捕获stdout/stderr,并在此时将其重定向到套接字,因此您应该重新设计客户端,以便在它转到stdout之前捕获发送给stdout的文本

此时,您可以根据需要将输出文本发送到标准输出和套接字

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

好的,第二次尝试:

既然您正在使用“假”客户端生成“真”客户端,为什么不在“假”客户端的stdin上截取“真”客户端的stdout(打开一个管道)。然后让“假”客户端将数据发送回套接字..

假设:

server talks with client

下面是MSDN中创建

不幸的是,您必须使用管道将IO从子程序获取到客户端。没有关于这件事的假设、假设或但是

然后,您可以使用类似以下的方法将信息获取到服务器:

客户端通信循环:

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);
}


实际上,您的客户端成为标准输出/错误管道和TCP套接字之间的转换器

我所知道的唯一支持这一点的环境是Cygwin。他们是开源的——试着仔细阅读他们的代码以获取想法。不过,这肯定会非常糟糕,因为到处都是线程。

这将是非常具体的实现。我假设windows是唯一的平台和操作系统需求。您愿意使用什么编译器、IDE和库?我正在使用visual studio。我想使用standart库和winapi作为套接字,我更喜欢socket2。但是也可以使用cygwin库。在套接字上-binding+侦听时,您遇到了哪些问题,连接套接字或重定向IO?我不想告诉你这个坏消息,但winsock没有办法将stdout重定向到套接字,你必须使用管道和其他进程将数据从管道复制到套接字等@Mihran。好吧,我不明白。您可以编写一个客户端应用程序,但它正在生成另一个您没有编写的应用程序?这是客户端下面的第二个应用程序,您希望捕获其标准输出/错误?谢谢。但我已经通过管道完成了),但还有其他问题。管道不支持select(),这就是我需要套接字的原因。您可以使用重叠I/O模型和
WaitForMultipleObjects
从多个管道读取或管理。它不像套接字列表上的
Select()
那么好,但这是一种伪装。您有多少个正在运行的客户端需要重定向到服务器?是的@AJG85我也可以这样做。但还有一个问题。如果我这样做,那么我需要在非阻塞模式下读取表单管道。在windows中,我不能使文件句柄非阻塞,我只能通过低级ReadFile函数在非阻塞模式下读取。但是我想从这个句柄生成FILE*,然后通过fgets读取。
ReadFileEx
是为异步调用而设计的。将句柄传递到管道并使用重叠的数据结构。您需要使用
WaitForMultipleObjects
来保护访问,这样您就无法完全避免阻塞以防止发生不好的事情™谢谢,但这没用。我有很多其他的代码可以使用FILE*,我应该从pipe FILE*中生成,为此我使用fgets方法调用ReadFile,没有重叠的结构。我不是real client的作者。我只是《假客户端》一书的作者,它应该只连接到服务器,然后它本身就产生了真正的客户端,stdout和stdoerr必须被重定向。@J看不到@AJG85s answer的评论这个想法不是在客户端和服务器之间打开管道,只是在“假”客户端和“真”客户端之间。“假”客户端仍将通过套接字发送其数据,因此您的服务器仍可以多路传输所有传入的请求并仅在一个进程上运行。Chris下面的回答说明了我所说的内容。@Mihran:我不明白,您非常不愿意走管道路线,但回顾您过去的问题,您已经坚定地探索了如何在Windows中使用异步管道实现IO重定向。有什么好处?你为什么不跟我们分享一下为什么你认为管道一开始是个坏主意?(特别是因为您发布的代码示例表明这已经是您正在做的事情)。@Chris您想说什么?我在问题中写道,不建议使用管道。Mihran,如果您无法修改可执行的“真实”客户端,您必须以某种方式拦截STDOUT/ERR。你真的应该重新考虑使用管道。@Mihran他不是指IPC管道,他是指IO重定向-在命令行中,你可以使用
并调用管道。他仍然在使用TCP(他的循环中的
send
),您必须使用管道从程序中获取
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);
}