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