基于SX單片機實現(xiàn)WebServer和網(wǎng)絡(luò)協(xié)議棧
TCP協(xié)議棧支持同時建立兩個TCP連接:一個為主動連接,由TCPApp1Init()來控制;另一個為被動連接,由TCPApp2Init()來控制。TCP是基于連接的協(xié)議,因為必須保持對TCP連接狀態(tài)的監(jiān)視和狀態(tài)有關(guān)的信息保存在發(fā)送控制塊中;而TCP連接狀態(tài)的改變由TCP的軟件狀態(tài)機來實現(xiàn)。軟件狀態(tài)機又由事件或用戶來觸發(fā)。比如,當(dāng)監(jiān)視到一個帶有SYN標(biāo)志的TCP包到達時,狀態(tài)機就將TCP連接轉(zhuǎn)換到接收狀態(tài);用戶也可以手工控制狀態(tài)機處于發(fā)送狀態(tài)來建立TCP連接。
① 用TCP API來建立TCP被動連接
_TCPApp2Init
_bank TCB2_BANK
mov tcb2LocalPortLSB, #HTTP_PORT_LSB ; 設(shè)置TCP的服務(wù)端口
mov tcb2LocalPortMSB, #HTTP_PORT_MSB
bank HTTP_BANK
clr httpParseState
clr httpURIHash
setb flags2.TCP_SOCK ; 顯示TCP2的連接狀態(tài)
jmp @TCPAppPassiveOpen ; 跳轉(zhuǎn)到TCP被動連接子程序,進行端口偵聽
retp
② 用TCP API建立TCP主動連接
_TCPApp1Init
test switch ; 條件觸發(fā)
sz
retp ; 沒有觸發(fā),退出
_bank HTTP_BANK
mov w, #HTTP_CONNECT ; 啟動HTTP狀態(tài)機
mov httpState, w
_bank TCB1_BANK
mov tcb1LocalPortLSB, #80 ; 設(shè)置本機TCP連接服務(wù)端口
mov tcb1LocalPortMSB, #80
mov tcb1RemotePortLSB, #HTTP_PORT_LSB ; 設(shè)置遠(yuǎn)程主機TCP連接服務(wù)端口
mov tcb1RemotePortMSB, #HTTP_PORT_MSB
_bank TCPSOCKET_BANK
mov sock1RemoteIP3,#SMTP_SERVER_IP3 ; 設(shè)置遠(yuǎn)程主機的IP地址
mov sock1RemoteIP2,#SMTP_SERVER_IP2
mov sock1RemoteIP1,#SMTP_SERVER_IP1
mov sock1RemoteIP0,#SMTP_SERVER_IP0
clrb flags2.TCP_SOCK ; 顯示TCP主動連接的狀態(tài)
jmp @TCPAppActiveOpen ; 在指定的端口建立TCP連接
retp
③ 用TCP API發(fā)送數(shù)據(jù)和接收數(shù)據(jù)
一旦建立了TCP連接,那就只有兩種情況:發(fā)送數(shù)據(jù)或接收數(shù)據(jù)。接收數(shù)據(jù)時,從IP層來的數(shù)據(jù)經(jīng)過狀態(tài)機去掉TCP包頭后再送到應(yīng)用層;發(fā)送數(shù)據(jù)時,軟件狀態(tài)機會在數(shù)據(jù)前面加上TCP包頭再發(fā)送到IP層。
接收數(shù)據(jù)時,需要用到的TCP API函數(shù)為TCPAppRxBytes()、TCPAppRxData()和TCPAppRxDone();發(fā)送數(shù)據(jù)時,有一點值得關(guān)注:為了防止接收緩沖區(qū)的溢出,相對于發(fā)送數(shù)據(jù)包,協(xié)議棧給予接收數(shù)據(jù)包以更高的優(yōu)先級。也就是說,協(xié)議棧軟件會一直處理接收的數(shù)據(jù)包,直到接收緩沖區(qū)中沒有任何數(shù)據(jù)。
發(fā)送數(shù)據(jù)時,需要用到的TCP API函數(shù)為TCPAppTxBytes()、TCPAppTxData()和TCPAppTxDone()。必須注意,只有在建立了TCP連接后,才可以發(fā)送數(shù)據(jù)。
3. 應(yīng)用層
HTTP是WWW上的協(xié)議。當(dāng)用戶要瀏覽服務(wù)器上的一個網(wǎng)頁時,一個HTTP 請求就會從用戶的瀏覽器發(fā)到HTTP服務(wù)器。服務(wù)器響應(yīng)這個請求,把指定的網(wǎng)頁傳送回來,用戶才看到了網(wǎng)頁。
下面是一個典型的客戶端向服務(wù)器發(fā)送請求的例子:
GET Destination_IP/index.html http/1.0
GET代表客戶端的請求命令,而服務(wù)器也受理這個命令;
Destination_IP代表遠(yuǎn)程主機的IP地址;index.html是客戶端請求的資源;
http/1.0是HTTP協(xié)議的版本。
評論