將最簡單的互動模式引入網絡是一個應用程序,它將其輸入前置並在stdout
上生成其輸出。在這種情況下,如提到的未知海報,您可以使用CGI。但是由於CGI的本質,如果所有信息都是從一個頁面中的用戶收集的,那麼這將僅適用於(從最簡單的意義上講),發送到應用程序並且結果返回到一個頁面中。這是因爲每次使用CGI調用一個頁面都會產生一個新的獨立進程來爲請求提供服務。 (現在還有其他更高效的解決方案,例如FastCGI,它可以保持一個流程池。)如果您的應用程序是交互式的,那麼它會收集一些信息,提供一些結果,打印一些選項,收集更多用戶輸入,然後生成更多的結果,它將需要適應。
下面是關於C++的最簡單可行的CGI程序:
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Content-type: text/plain\n" << std::endl;
std::cout << "Hello, CGI World!" << std::endl;
}
它所做的就是返回的內容類型之後是一個空行,則實際內容與一貫沉悶的問候。
要接受用戶輸入,您需要在HTML中編寫一個表單,並且POST
目標是您的應用程序。將通過包含請求的參數字符串,在平時的HTTP風格:
foo.cgi?QTY=123&N=41&DESC=Simple+Junk
你會那麼就需要分析查詢字符串(通過QUERY_STRING
環境變量傳遞給程序)來收集將表單中的輸入字段傳遞給您的應用程序。請注意,解析參數字符串是大量安全漏洞的來源。爲C++找到一個CGI庫(一個Google搜索揭示很多)肯定是值得的,它爲你解析。查詢數據可以得到:
const char* data = getenv("QUERY_STRING");
那麼至少,你需要改變你的應用程序從name=value
對查詢字符串接受它的輸入。如果你不想要,你甚至不需要生成HTML;只需將內容類型返回爲text/plain
即可。然後,您可以稍後使用HTML來改進它(並相應地更改內容類型)。
還有其他更復雜的解決方案,包括整個web框架,如Wt。但是,這將涉及到您的應用程序的相當大的變化,你說你希望避免。
另外我遇到了另一個問題。大多數這些程序都被提交給一個自動化系統,該系統爲每個程序提供自動化樣本輸入,運行它,然後將其與預設輸出進行比較。我相信這是一個ACM網站,不記得了。無論如何,當我嘗試直接從Windows資源管理器運行.exe文件時,控制檯彈出,程序運行,然後控制檯關閉。該程序運行得非常快,我不明白會發生什麼。其他首先打開CMD並通過該程序運行程序,我不知道如何保持.exe的速度非常快。想法? – 2009-09-25 23:11:19
在Windows上使用例如:: system(「pause」)在main的結尾。提交到網站之前一定要將其刪除。 – 2009-09-25 23:23:44
這個簡單的模型,輸入 - >處理 - >輸出,是最容易適應CGI處理的,兩端都有大量的膠水代碼。 (我會建議使用'getch()'或其他東西,而不是僅僅爲了運行'暫停')。) – gavinb 2009-09-25 23:37:51