我正在研究用Objective-C/cocoa編寫的fastcgi開發工具包,它模仿AppKit/UIKit的行爲和結構(應用程序刪除,runloops,事件隊列等等)。我在fastcgi,libfcgi,使用libfcgi的fastcgi目標c實現上完成了我的功課,並且我已經意識到,爲了使它成爲100%「可可」,我必須自己實現協議從頭開始(libfcgi設計爲「循環」的方式與CoreFoundation RunLoops和事件隊列無法很好地協調)。什麼是由本地http服務器產生的自定義FCGI應用程序的套接字路徑? (即apache/mod_fcgid,lighttpd/mod_fastcgi等)
這就是說,有在fastcgi.com是一個fastcgi的應答者應用按照文檔(FCGI白皮書)在下列情況下:
- 應用是本地的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
。 **它可以超時,因爲我沒有在代碼中做任何事情來響應請求或將任何數據發送回服務器(我相當遙遠)。
如果服務器根據請求動態創建套接字,應用程序如何知道偵聽哪個套接字路徑(讀取/寫入)?