如何使用c/c++語言制作一個網(wǎng)站(web開發(fā))?
時間:2023-12-04 17:12:01 | 來源:網(wǎng)站運(yùn)營
時間:2023-12-04 17:12:01 來源:網(wǎng)站運(yùn)營
如何使用c/c++語言制作一個網(wǎng)站(web開發(fā))?:
1.前言
用各種語言寫過一些網(wǎng)站之后,我不禁開始好奇,C++能不能寫網(wǎng)站呢,實際上想到這個問題的時候,我就大致有了答案。
本文中我們將嘗試用C++寫一個簡單的網(wǎng)站,探索一些細(xì)節(jié)性的問題,并報告用C++寫網(wǎng)站的體驗如何。
2.準(zhǔn)備工作
無論是之前比較傳統(tǒng)的PHP,java,還是新興的python或Go,在運(yùn)行網(wǎng)站項目的時候都必須依托于一個webserver。(這樣的表述不一定嚴(yán)謹(jǐn))
恰好我正在寫PHP,因此手邊有一個Wamp Server,我就用它了。Wamp Server,這是一個集成了Apache httpd,mysql數(shù)據(jù)庫以及PHP的一個集成環(huán)境。
同時推薦朋友們也可以下載一個wampserver,畢竟它也并不大。萬一以后要寫PHP,還能用的上,再怎么說,
PHP也是公認(rèn)的世界上最好的語言。
我們可以很輕易的從Apache的根目錄下找到這個cgi-bin文件夾,下面我們只要把編譯好的二進(jìn)制文件放進(jìn)這個文件夾內(nèi),就可以通過web訪問了。
3.編寫第一個C++網(wǎng)站
這里的一些步驟是參考菜鳥教程的C++web編程的。然而在菜鳥教程中,C++web編程只占了一個小節(jié),并沒有過多敘述。以下是菜鳥教程給出的demo
/**file name: index.cppcompiled binary file nameL index.exelanguage: cpp*/#include <iostream>using namespace std;int main (){ cout << "Content-type:text/html/r/n/r/n"; cout << "<html>/n"; cout << "<head>/n"; cout << "<title>Hello World - 第一個 CGI 程序</title>/n"; cout << "</head>/n"; cout << "<body>/n"; cout << "<h2>Hello World! 這是我的第一個 CGI 程序</h2>/n"; cout << "</body>/n"; cout << "</html>/n"; return 0;}
特別說明:Content-type:text/html/r/n/r/n的含義是要求瀏覽器以頁面的方式進(jìn)行讀取,否則有可能會報錯,或使瀏覽器下載這個index.exe。接著我們進(jìn)行編譯,將編譯好的可執(zhí)行程序放到上面說的那個目錄下。
這時候訪問瀏覽器localhost/cgi-bin/index.exe,可以看到如下效果,我的是Windows機(jī)器,因此編譯鏈接之后得到exe文件。
發(fā)明這種技術(shù)的人將其命名為CGI(Common Gateway Interface),按照習(xí)慣,一般會將C++編譯得到的可執(zhí)行文件進(jìn)行重命名,改為以.cgi結(jié)尾,但經(jīng)過我的嘗試,命名并不影響其運(yùn)行,哪怕沒有后綴名也可以。
4.對demo進(jìn)行改進(jìn)
我們發(fā)現(xiàn),CGI技術(shù)就好像把C++的輸出流接在了客戶端的瀏覽器一樣(這樣表述似乎也不算嚴(yán)謹(jǐn)),只要通過cout對象就可以展示網(wǎng)頁。但是顯然,上述demo只能實現(xiàn)一個靜態(tài)網(wǎng)頁,且網(wǎng)頁的維護(hù)難度也比較大。顯然我們值得擁有更好地辦法。我們將這個程序做如下修改:
#include <iostream>#include <fstream>#include <string>using namespace std;int main (){ cout << "Content-type:text/html/r/n/r/n"; fstream f("index.html"); string line; while(getline(f,line)){ cout << line << endl; } f.close(); return 0;}
用這種方法,我們可以事先寫好一個index.html的頁面文件,利用這個index.exe程序?qū)ξ覀儗懞玫捻撁嬷鹦凶x取并顯示在客戶端的瀏覽器上。如此一來我們只需要動態(tài)的修改頁面并保存,不需要再對cpp進(jìn)行編譯,就可以在線的調(diào)試頁面。(此處使用相對路徑,故編譯得到的index.exe和index.html應(yīng)當(dāng)一同放在cgi-bin目錄下)
5.與C++后臺進(jìn)行交互
到此為止我們已經(jīng)實現(xiàn)了基本的C++網(wǎng)站,但是還只停留在靜態(tài)網(wǎng)站上。我們只能讓C++幫我們想客戶端返回一個靜態(tài)的頁面,但沒有實現(xiàn)與后臺交互。
這里我們簡單的試驗一下用C++做后臺處理post請求。對于C++處理post請求來說,真可謂==大道至簡==,只要用cin對象就可以了。
下面我們嘗試用post方法將一張表單的內(nèi)容發(fā)給另一個可執(zhí)行文件,由另一個可執(zhí)行文件將post的數(shù)據(jù)顯示出來。具體細(xì)節(jié)如下
首先我們準(zhǔn)備一個用來進(jìn)行post提交的表單頁面
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>INDEX</title></head><body> <form action="post_test.exe" method="post"> username<input type="text" name="username"><br> password<input type="password" name="password"><br> <input type="submit"> </form></body></html>
在表單中讓用戶填入用戶名密碼,然后提交給post_test.exe這個可執(zhí)行文件。 這個post_test.exe的可執(zhí)行文件,其C++代碼更加簡單
#include <iostream> #include <string> using namespace std; int main () { cout << "Content-type:text/html/r/n/r/n"; string post_data; cin >> post_data; cout << post_data; }
只需要一行cin,就可以拿到這個post請求的數(shù)據(jù),然后再通過cout將其顯示到客戶端上。
講這些文件放到cgi-bin目錄下,就可以運(yùn)行了。
可以看到表單信息以字符串“username=123&password=123”的形式被post_test.exe這個程序接收到了。
6.應(yīng)用
光說不練假把式,于是我們用C++網(wǎng)站做一個簡單的行列式計算器。實際上小規(guī)模行列式用js求解效率就足夠感人了,但為了突出C++的前后端交互,我們將用戶的輸入數(shù)據(jù)發(fā)送到后臺,由C++計算并給出結(jié)果。
這理就不展示具體代碼了,讀者可以自行實現(xiàn)。
7.缺陷
我的機(jī)器是Windows平臺,起初我實在本機(jī)上進(jìn)行開發(fā),之后要部署到服務(wù)器的時候我就傻眼了——我的服務(wù)器是linux機(jī),顯然linux一般是不能直接跑exe這種可執(zhí)行文件的。無奈只好又把cpp源碼拷貝到服務(wù)器上,再編譯得到linux上的可執(zhí)行文件進(jìn)行部署。此時此刻我才體會到優(yōu)越的跨平臺性能在某些特定場合也是非常重要的! 順便提一下,在linux上使用G++編譯,默認(rèn)的并不一定是C++11的版本,可以通過-std指定
g++ -std=c++11 xxx.cpp -o xxx
否則在C++11下寫的某些代碼可能會被報錯。
8.總結(jié)
總的來說,C/C++并不是非常適合網(wǎng)站開發(fā)。古代的程序員前輩們似乎也意識到了這一點(diǎn),因此他們在C的基礎(chǔ)上融合了許多便捷的工具,得到了PHP。同時Java等跨平臺性能卓越的語言也在web開放中占據(jù)了一席之地。這里我就簡單對比一下C++和我比較熟悉的PHP在開發(fā)網(wǎng)站上的異同。 算了不比了,本站不支持Markdown很難受。
9.附錄
https://github.com/RadiumScriptTang/CppWebsite