我想创建客户端服务器程序,其中服务器是主进程,客户端是子进程。在客户端我想将stdout和stderr子进程流重定向到套接字。在服务器中我想从套接字文件描述符中获取并从中读取。在互联网上有很多关于套接字的信息,但是我没有通过windows的套接字找到任何父子IPC的例子。
如果可能的话,请在这里发布一个解决我的问题(或部分)的简单代码。链接到msdn也可以提供帮助,但我想我已经在那里查找了所有内容而没有找到我想要的内容。
P.S。请不要建议管道。我想通过套接字来做到这一点。
答案 0 :(得分:1)
看看Netcat如果你可以使用它,或者在sourceforge上的某个地方找到windows版本的源代码,可能这可以使用管道拦截stdin / stdout并发送和读取带有这些管道的套接字。< / p>
我知道你说过没有管道,但是没有其他方法可以只使用Windows API。您至少可能需要以下内容:
答案 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。它们是开源的 - 尝试仔细阅读他们的想法代码。不过,它确实是非常令人讨厌的,就像抽充螺纹一样。