用有限狀態機處理http請求

2021-10-07 11:54:36 字數 3843 閱讀 5273

#include

#include

#include

#include

#include

#include

#include

//主狀態機有兩種狀態,當前正在分析請求行,當前正在分析頭部字段

enum check_state

;//從狀態機三種狀態,讀取完整一行,行出錯,行資料讀取不完整

enum line_status

;/*伺服器處理結果:no_request表示請求不完整,需要繼續讀取客戶資料;get_request表示獲得了乙個完整的客戶端請求;

bad_request表示客戶請求有語法錯誤;forbidden_request表示客戶對資源沒有足夠的訪問許可權;internal_error表示伺服器內部錯誤;

close_connection表示客戶端已關閉連線*/

;//從狀態機解析出一行的內容,buf指向緩衝區,check_index指向當前正分析的位元組,read_index指向緩衝區資料尾部的下乙個位元組

line_status parse_line

(char

* buf,

int& check_index,

int& read_index)

else

if(buf[check_index +1]

=='\n'

)return line_bad;

}else

if(temp ==

'\n'

)return line_bad;}}

return line_open;

}//分析請求行

;//分析請求方法是否為get方法

char

*p_1 = temp;if(

strcasecmp

(p_1,

"get")==

0)//忽略大小寫比較字串

else

return bad_request;

url +

=strspn

(url,

" \t");

//清除前面多餘的空格

char

*p_2 =

strpbrk

(url,

" \t");

if(!p_2)

*p_2++

='\0'

;//分析協議版本欄位的正確性

//分析url的正確性if(

)//若http://後面沒有/字元或者url前七個位元組不是"http://",則語法錯誤

printf

("the request url is: %s\n"

,url)

;//http請求行處理完畢,狀態轉移到頭部字段進行分析

checkstate = check_state_header;

return no_request;

}//分析頭部字段

}/*分析http請求入口函式*/

//第二個狀態,分析頭部字段

break;}

default:}

}//若沒有讀取到乙個完整的行,則表示還需要繼續讀取客戶端資料才能進一步分析

if(linestatus == line_open)

else

}int

main

(int argc,

char

*ar**)

char

* ip = ar**[1]

;int port =

atoi

(ar**[2]

);int listenfd,clifd;

struct sockaddr_in ser_addr,cli_addr;

socklen_t cli_len =

sizeof

(cli_addr)

; listenfd =

socket

(af_inet,sock_stream,0)

; ser_addr.sin_family = af_inet;

ser_addr.sin_port =

htons

(port)

;inet_pton

(af_inet,ip,

&ser_addr.sin_addr)

;bind

(listenfd,

(struct sockaddr*

)&ser_addr,

sizeof

(ser_addr));

listen

(listenfd,3)

; clifd =

accept

(listenfd,

(struct sockaddr*

)&cli_addr,

&cli_len);if

(clifd ==-1

)char buf[bufsiz]

;int read_num =0;

int read_index =0;

//當前已經讀入多少位元組的客戶資料

int check_index =0;

//當前已經分析完了多少位元組的客戶資料

int start_line =0;

//行在buf中的起始位置

check_state checkstate = check_state_requestline;

//設定主狀態機的初始狀態

while(1

)//迴圈讀取資料並分析

else

if(read_num ==0)

read_index +

= read_num;

//分析目前已經獲得的所有資料

//沒有獲得完整的資料

//得到乙個完整的、正確的http請求

else

}close

(clifd)

;close

(listenfd)

;return0;

}

有限狀態機

有限狀態機 finite state machine,fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。狀態儲存關於過去的資訊,就是說 它反映從系統開始到現在時刻的輸入變化。轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它。動作是在給...

有限狀態機

以前,只碰到過 陣列中所有數字只出現2次,只有乙個出現1次,找這個數的問題 每次迴圈異或陣列中元素,最後的結果就是single one。這次換作出現3次就懵逼了,主要原因,沒有使用過有限狀態機,應該說是連概念都沒有,所以這次一定要好好記錄一下 關於這道題的解釋discussion中woshidais...

有限狀態機

需要掌握的名詞 數字系統有兩大類有限狀態機 finite state machine,fsm moore狀態機和mealy狀態機。狀態機名 次態輸出 moore摩爾 f 現狀,輸入 g 現狀 mealy公尺粒 f 現狀,輸入 g 現狀,輸入 mealy型狀態機 下一狀態不但與當前狀態有關,還與當前輸...