2013-05-01 50 views
1

我正在研究用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白皮書)在下列情況下:

  1. 應用是本地的Web服務器,並通過衍生後者根據需要實現傳入請求
  2. 應用程序對於Web服務器是本地或遠程的,但Web服務器假定它已在運行並通過域套接字或tcp/ip套接字與它通信。

對於第二種情況,我很好,因爲我可以控制套接字路徑/ ip地址和端口,我希望我的應用程序可以偵聽:我知道我的通信渠道。

我遇到的問題是第一種情況。我一直在篩選通過fci_stdio.cfcgiapp.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。 **它可以超時,因爲我沒有在代碼中做任何事情來響應請求或將任何數據發送回服務器(我相當遙遠)。

如果服務器根據請求動態創建套接字,應用程序如何知道偵聽哪個套接字路徑(讀取/寫入)?

回答

1

最後,經過多一點挖,反覆試驗,大量的咖啡和一些新鮮的空氣我就在http://www.fastcgi.com/devkit/doc/fcgi-spec.html

2.2文件描述符

acress在FastCGI的規範一個段落Web服務器在應用程序開始執行時會保留一個文件描述符FCGI_LISTENSOCK_FILENO。此描述符指的是由Web服務器創建的偵聽套接字。

FCGI_LISTENSOCK_FILENO等於STDIN_FILENO。標準描述符STDOUT_FILENO和STDERR_FILENO在應用程序開始執行時關閉。應用程序確定是否使用CGI或FastCGI調用的可靠方法是調用getpeername(FCGI_LISTENSOCK_FILENO),該函數返回-1,並將errno設置爲ENOTCONN以用於FastCGI應用程序。

Web服務器選擇的可靠傳輸,Unix流管道(AF_UNIX)或TCP/IP(AF_INET)隱含在FCGI_LISTENSOCK_FILENO套接字的內部狀態中。

因此,我真的不應該關心套接字的實際物理路徑,因爲它正通過STDIN流傳遞給我的應用程序。我需要做的就是傾聽。我們都不是嗎?!

既然我知道該聽什麼,我可以使用[NSFileHandle acceptConnectionInBackgroundAndNotify](請參閱Apple文檔here)來偵聽套接字並響應請求。

Whe!

相關問題