簡單的嵌入式web伺服器設計

2021-09-23 01:38:54 字數 4323 閱讀 3403

web瀏覽器

瀏覽器是個顯示網頁伺服器或檔案系統內的html檔案,並讓使用者與此些檔案互動的一種軟體。個人電腦上常見的網頁瀏覽器包括internet explorer、firefox、safari。瀏覽器是最經常使用到的客戶端程式。

web伺服器

通俗的講,web服務傳送頁面使得瀏覽器可以瀏覽,它專門處理http請求。

嵌入式伺服器架構

socket程式設計技術

socket介面是tcp/ip網路的api,socket介面定義了許多函式或例程

socket可以支援資料的傳送和接收,它會定義一種稱為套接字的變數,傳送資料時首先建立套接字,然後使用該套接字的sendto等方法對準某個ip/埠進行資料傳送;接收端也首先建立套接字,然後將該套接字繫結到乙個ip/埠上,所有發向此埠的資料會被該套接字的recv等函式讀出。如同讀出檔案中的資料一樣 

http協議

http--hyper text transfer protocol,超文字傳輸協議,是一種建立在tcp上的無狀態連線,整個基本的工作流程是客戶端傳送乙個http請求,說明客戶端想要訪問的資源和請求的動作,服務端收到請求之後,服務端開始處理請求,並根據請求做出相應的動作訪問伺服器資源,最後通過傳送http響應把結果返回給客戶端。其中乙個請求的開始到乙個響應的結束稱為事務,當乙個事物結束後還會在服務端新增一條日誌條目

一次完整的http請求需要七個步驟

http報文:

它是http應用程式之間傳送的資料塊。這些資料以一定的文字資訊開頭,這些資訊描述了報文的內容及含義,報頭後跟著資料部分

一次http請求,http會從客戶端流到伺服器,伺服器的工作完成後,報文從伺服器流到客戶端

所有的http報文都可以分為請求報文和響應報文。它們的結構基本相同,只有起始語法些許不同

請求報文:它會向web伺服器請求乙個動作

請求報文的格式:

起始行: 

頭部:   

主體:   

響應報文:它會將請求的結果返回給客戶端。

響應報文的格式:

起始行:  

頭部:    

主體:    

1、方式(method):客戶端希望伺服器對資源執行的動作,是乙個單獨的詞,比如,get、post或head

2、請求url(request-url):要直接與伺服器進行對話,只要請求url是資源的絕對路徑就可以了,伺服器可以假定自己是url的主機/埠

3、版本(version):報文所使用的http版本。其格式:http/《主要版本號》.《次要版本號》

4、狀態碼(status-code):狀態碼是三位數字,描述了請求過程中所發生的情況。每個狀態碼的第一位數字都用於描述狀態的一般類別(比如,「成功」、「出錯」等等)

5、原因短語(reason-phrase):數字狀態碼的可讀版本,包含行終止序列之前的所有文字。原因短語只對人類有意義,因此,儘管響應行http/1.0 200 not ok和http/1.0 200 ok中原因短語的含義不同,但同樣都會被當作成功指示處理

6、頭部(header):可以有零個或多個頭部,每個首部都包含乙個名字,後面跟著乙個冒號(:),然後是乙個可選的空格,接著是乙個值,最後是乙個crlf首部是由乙個空行(crlf)結束的,表示了頭部列表的結束和實體主體部分的開始

7、實體的主體部分(entity-body):實體的主體部分包含乙個由任意資料組成的資料塊,並不是所有的報文都包含實體的主體部分,有時,報文只是以乙個crlf結束。

socket程式設計介面1.socket()函式

int socket(int domain,int type,int protocol);

說明:socket()函式建立乙個套接字

引數:domain 應用程式所在主機使用的通訊協議族

type 建立的套接字型別

protocol 使用的特定協議

2.bind()函式

int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen);

引數:sockfd socket返回的檔案描述符

my_addr 指向結構體sockaddr的指標,儲存位址資訊(埠、ip)

addrlen sockaddr的長度

3、connect函式

int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);

說明:建立套接字連線,成功返回0,否則返回-1

引數:sockfd socket返回的檔案描述符

serv_addr 儲存著連線資訊的結構體sockaddr

addrlen sockaddr的長度

4、listen()函式

int listen(int sockfd,int backlog);

說明:使得乙個程序可以接受其它程序的請求,使其變為伺服器程序

引數:sockfd socket返回到檔案描述符

backlog 允許建立連線的數目

5、accept()函式

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

說明:用於流式套接字的通訊,返回實際傳送的資料的位元組數

引數:sockfd socket返回的檔案描述符

addr 儲存套接字資訊的結構體

addrlen addr的長度

6、send()函式

ssize_t send(int sockfd,const void *msg,size_t len,int flags);

說明:用於流式套接字或資料報套接字的通訊,返回實際傳送的資料的位元組數

引數:sockfd 傳送資料的套接字描述符

msg 指向傳送資料的指標

len 傳送資料的長度

flags 預設為0

7、recv()函式

ssize_t recv(int sockfd,void *buf,size_t len,int flags);

說明: 用於流式套接字的通訊,返回值為實際讀入緩衝的資料的位元組數

引數:sockfd 要讀的套接字描述符

buf 要讀的訊息的緩衝區

len 緩衝的最大長度

flags 預設為0

apache伺服器的安裝apaches世界排名第一的web伺服器軟體。它可以執行在所有廣泛使用的計算機平台上,由於其跨平台和安全性被廣泛使用。

終端輸入:apt-get install apache2

只需乙個指令,你就能完成apache的安裝,如果你想要進行apache的各種配置,請自行搜尋

安裝之後,apache預設是開啟的且每次會隨系統啟動

終端輸入:apachectl -v檢視apache的版本

當然,你可以在瀏覽器輸入你伺服器的ip位址(安裝伺服器的linux的ip),如果你得到預設介面,那麼一切都是正常的

之後,你就能在/var/www/html/下找到index.html檔案,編輯它,你就能得到你想要的介面

效果如下:

該頁面為仿寫**頁面

嵌入式Web伺服器移植

或者 最新發行版本 0.94.13 解壓 tar xzf boa 0.94.13.tar.gz 直接執行src configure檔案 a 修改 cc gcc 為 cc usr local arm 2.95.3 bin arm linux gcc b 修改 cpp gcc e 為 cpp usr l...

嵌入式Web伺服器移植

文章一僅供個人學習之用,請勿用於他途。n printf n printf n printf n printf n exit 0 交叉編譯生成helloworld.cgi arm softfloat linux gnu gcc o helloworld.cgi helloworld.c 將hellow...

嵌入式web伺服器的實現

1 引言 呼叫 open 開啟裝置,利用 ioctl 對裝置進行控制,比如設定對比度 亮度 調色盤,訪問模式等等。主要 如下 int fd open dev v4l video0 o rdwr 開啟裝置 獲取裝置的基本資訊 裝置名稱 支援的最大最小解析度 訊號源資訊等 ioctl vd fd,vid...