我正在开发一个用objective-c/cocoa 编写的fastcgi 开发工具包,它模仿AppKit/UIKit 的行为和结构(应用程序委托、运行循环、事件队列等)。我已经完成了关于 fastcgi、libfcgi、使用 libfcgi 的 fastcgi 目标 c 实现的功课,但我很遗憾地意识到,为了使其 100%“可可”,我必须自己实现协议,从从头开始(libfcgi 被设计为“循环”的方式与 CoreFoundation RunLoops 和事件队列不兼容)。
话虽如此,根据 fastcgi.com 上的文档(FCGI 白皮书),fastcgi-responder 应用程序有以下几种情况:
- 该应用程序是 Web 服务器的本地应用程序,并由后者根据需要生成,以满足传入的请求
- 该应用程序对于 Web 服务器来说是本地或远程的,但 Web 服务器假定它已经在运行并通过域套接字或 tcp/ip 套接字与其通信。
我对第二种情况很好,因为我可以控制我希望我的应用程序监听的套接字路径/IP 地址和端口:我知道我的通信通道在哪里。
我遇到的问题是第一种情况。我一直在筛选fci_stdio.c
并fcgiapp.c
查看FCGX_Accept_r
,等FCGX_InitRequest
,FCGX_Stream
我似乎无法找到它试图读取的套接字。
不,这不是stdin
因为它被劫持并“封装”到fastcgi.com 文档中指定的FCGI_FILE
结构中。fcgi_stdio.h
我承认我的 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
. ** 它可以超时,因为我没有在代码中做任何事情来响应请求或将任何数据发送回服务器(我离那个很远)。
如果服务器根据请求动态创建套接字,应用程序如何知道要监听(读取/写入)的套接字路径?