mod_fcgid windows 命名管道第二次及后续请求

mod_fcgid windows named pipes 2nd and subsequent requests

全部,我正在为基于 运行 时间的编程语言构建 fastCGI 接口,运行s 在 Windows、Linux 和 UNIX 中环境。

我已经在 运行 的 运行 时间内的程序代码中实现了 fastCGI 协议,但我遇到了 Windows 代码的问题,该代码与 mod_fcgid。在这种情况下,我不能使用预构建的 dll 来公开 fastCGI 函数,但我可以从 运行time 语言中调用大多数 C 函数。我无法修改 运行time,因为它属于另一家公司...将其视为一种 php 或类似 perl 的语言。我想要做的类似于创建一个类似 dll 的代码集(它不是 dll)来处理 fastCGI 请求。虽然很多人会说我 "re-inventing the wheel" 在这里,但我别无选择,只能使用某人预建的 dll 来提供 fastCGI 的接口。

我已经成功地实现了一切,我可以得到初始请求,并通过我的 fastCGI 接口用网页响应。我遇到的问题是在 Windows 下 运行 时处理 "next" 请求。当 运行ning 在 Linux 下时,我的代码非常棒,我接受()套接字,读取()写入()进行处理,关闭()套接字,然后返回并接受()再次,我收到了下一个请求,一切都完美地进行了。

在 Windows mod_fcgid 下使用命名管道。在我的代码中,我使用 GetStdHandle() 获取标准输入的句柄,然后使用 ReadFile() 和 WriteFile() 并且包装在 fastCGI 协议中的数据转到 mod_fcgid ,然后在完成请求后转到浏览器我使用 CloseHandle() 然后循环回到 GetStdHandle() 等待下一个请求。

第一个请求一切正常,浏览器获取我的 cgi 输出。 Linux 下的相同代码使用套接字,获取第二个和后续请求并且工作起来很有魅力。

我的问题是:运行在 Windows 下处理第一个请求后,我无法让 mod_fcgid 向我发送第二个请求。它最终会终止我的 windows 进程并在其位置启动一个新进程。这当然不是我想要的。

我一定是在发送 fastCGI EndRequest 和循环等待下一个请求进来之间做错了什么。

为了从 mod_fcgid 获取初始请求,我使用 GetStdHandle() 然后使用 ReadFile() 和 WriteFile()(全部来自 kernel32.dll),当我完成协议时它的 EndRequest,我无法获得能够接收第二个请求的代码。

我试过 fflush() 我试过 FileFlushBuffers(),我试过不关闭 GetStdHandle() 给我的句柄,我根本无法弄清楚 mod_fcgid 需要什么windows 应用程序,以便我可以接收第二个和后续请求。

在第一个请求之后,关闭我的句柄,从 GetStdHandle 获取到 stdin 的句柄,然后坐在 ReadFile 上,ReadFile() 返回 0 字节,而 GetLastError() 总是 returns 6 (句柄无效)。

我根本无法弄清楚在第一个请求完成后用于清理的 C 函数,以及在 Windows 下 运行 时能够等待下一个请求进入的函数。正如我之前所说,当使用套接字而不是 Windows 时,代码在 Linux 下工作完美,后者使用来自 STDIN 的句柄,即命名管道。

Harry,您对使用 NamedPipe 函数的评论起到了作用,我需要使用 FileFlushBuffers,然后在第一个请求结束时使用 DisconnectNamedPipe,然后使用 ConnectNamedPipe 等待下一个请求进入。谢谢又是你