gpt4 book ai didi

objective-c - 由本地 http 服务器生成的自定义 FCGI 应用程序的套接字路径是什么? (即apache/mod_fcgid、lighttpd/mod_fastcgi等)

转载 作者:行者123 更新时间:2023-12-03 16:37:15 24 4
gpt4 key购买 nike

我正在开发一个用 Objective-C/cocoa 编写的 fastcgi 开发工具包,它模仿 AppKit/UIKit 的行为和结构(应用程序委托(delegate)、运行循环、事件队列等)。我已经完成了关于 fastcgi、libfcgi、使用 libfcgi 的 fastcgi Objective-C 实现的作业,并且我悲伤地意识到,为了使其 100%“ cocoa ”,我必须自己实现该协议(protocol),从草稿(libfcgi 设计为“循环”的方式与 CoreFoundation RunLoops 和事件队列不能很好地配合)。

话虽如此,根据 fastcgi.com 上的文档(FCGI 白皮书),fastcgi-responder 应用程序存在以下情况:

  1. 该应用程序位于网络服务器本地,并由后者根据需要生成以满足传入请求
  2. 应用程序对于 Web 服务器而言是本地或远程的,但 Web 服务器假定它已经在运行并通过域套接字或 tcp/ip 套接字与其进行通信。

我对第二种情况没问题,因为我可以控制我希望我的应用程序监听的套接字路径/IP 地址和端口:我知道我的通信 channel 在哪里。

我遇到的问题是第一个场景。我一直在筛选fci_stdio.cfcgiapp.c,查看FCGX_Accept_rFCGX_InitRequestFCGX_Stream 等,我似乎无法找到它尝试读取的套接字。

不,它不是 stdin,因为它被劫持并“封装”到 fcgi_stdio.h 中的 FCGI_FILE 结构中,如文档中指定的那样在 fastcgi.com。我承认我的 posix 编程时代已经过去了,我有点生疏了。我肯定错过了一些东西。

我尝试在我的应用程序中监听 stdin,但出现了 posix 错误 57(未指定错误)并且没有数据。以下是我在示例应用程序的日志中获得的输出示例:

2013-05-01 11:40:01.486 Test-FCGIKit[2477:707] /Users/catalin/Sites/fcgi/Test-FCGIKit-CocoaBundle.bundle/Contents/MacOS/Test-FCGIKit
2013-05-01 11:40:01.495 Test-FCGIKit[2477:707] applicationWillFinishLaunching:
2013-05-01 11:40:01.497 Test-FCGIKit[2477:707] startRunLoop
2013-05-01 11:40:01.498 Test-FCGIKit[2477:707] applicationDidFinishLaunching:
2013-05-01 11:40:01.500 Test-FCGIKit[2477:707] * Waiting for events
2013-05-01 11:40:01.501 Test-FCGIKit[2477:707] didReadToEndOfStdIn:
2013-05-01 11:40:01.502 Test-FCGIKit[2477:707] NSConcreteNotification 0x7fb3d9806670 {name = NSFileHandleReadToEndOfFileCompletionNotification; object = <NSConcreteFileHandle: 0x7fb3d8c15030>; userInfo = {
NSFileHandleError = 57;
NSFileHandleNotificationDataItem = <>;
}}
2013-05-01 11:40:01.504 Test-FCGIKit[2477:707] * Waiting for events
2013-05-01 11:40:01.508 Test-FCGIKit[2477:707] * Processed event
2013-05-01 11:40:01.510 Test-FCGIKit[2477:707] * Waiting for events
[Wed May 01 11:40:41 2013] [warn] [client 127.0.0.1] mod_fcgid: read data timeout in 40 seconds
[Wed May 01 11:40:41 2013] [error] [client 127.0.0.1] Premature end of script headers: Test-FCGIKit
2013-05-01 11:40:43.337 Test-FCGIKit[2477:707] Caught SIGTERM. Terminating.
2013-05-01 11:40:43.338 Test-FCGIKit[2477:707] terminate:
2013-05-01 11:40:43.339 Test-FCGIKit[2477:707] applicationShouldTerminate:
2013-05-01 11:40:43.343 Test-FCGIKit[2477:707] quit
2013-05-01 11:40:43.345 Test-FCGIKit[2477:707] applicationWillTerminate:
  • 请不要被消息名称误导:它们与 AppKit/UIKit 完全相同,但并非来自 NSApplication。** 超时没什么问题,因为我没有在代码中执行任何操作来响应请求或将任何数据发送回服务器(我离这个还很远)。

如果服务器根据请求动态创建套接字,应用程序如何知道要监听(读取/写入)的套接字路径?

最佳答案

最后,经过更多的挖掘、尝试和错误,喝了很多咖啡,呼吸了一些新鲜空气,我在 FastCGI 规范中找到了一个段落 http://www.fastcgi.com/devkit/doc/fcgi-spec.html

2.2 File Descriptors

The Web server leaves a single file descriptor, FCGI_LISTENSOCK_FILENO, open when the application begins execution. This descriptor refers to a listening socket created by the Web server.

FCGI_LISTENSOCK_FILENO equals STDIN_FILENO. The standard descriptors STDOUT_FILENO and STDERR_FILENO are closed when the application begins execution. A reliable method for an application to determine whether it was invoked using CGI or FastCGI is to call getpeername(FCGI_LISTENSOCK_FILENO), which returns -1 with errno set to ENOTCONN for a FastCGI application.

The Web server's choice of reliable transport, Unix stream pipes (AF_UNIX) or TCP/IP (AF_INET), is implicit in the internal state of the FCGI_LISTENSOCK_FILENO socket.

因此,我真的不应该关心套接字的实际物理路径,因为它是通过 STDIN 流传递到我的应用程序的。我所需要做的就是倾听。我们不是都这样吗?!

因为我知道要监听什么,所以我可以使用 [NSFileHandle receiveConnectionInBackgroundAndNotify] (请参阅 Apple 文档 here )来监听套接字并响应请求。

哇!

关于objective-c - 由本地 http 服务器生成的自定义 FCGI 应用程序的套接字路径是什么? (即apache/mod_fcgid、lighttpd/mod_fastcgi等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16315254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com