c語言實現簡單web伺服器

來源:互聯網
上載者:User

標籤:就會   釋放   執行   rman   ascll   created   ase   mod   parser   

1http簡單介紹

http超文字傳輸通訊協定 (HTTP):host主機地址:port連接埠/url

host會被DNS伺服器 解析成IP地址,所以有時候可以直接用網域名稱,

http預設訪問80連接埠,https預設訪問443連接埠


大致流程就是:瀏覽器輸入地址後,首先和web伺服器建立tcp串連,

然後瀏覽器發送http請求報文, web伺服器響應處理這個報文,

然後給他回複一個響應,然後伺服器主動中斷連線。





2http請求報文格式


首先第一個就是請求的方法,方法有一下這些:
GET,POST,HEAD,PUT,DELETE,OPTIONS,TRACE,CONNECT;


1GET

在瀏覽器輸入的網址,瀏覽器就會發送GET的http報文請求。

如果不寫url 預設就是 "/"  伺服器 可根據這個響應對應的頁面.

頭部資訊就包含一些重要的請求資訊,如主機地址.

瀏覽器版本 , 手機的頁面就是根據這個去做的.

GET 攜帶參數是在url裡面的, POST是攜帶在包體裡面的.

包體成為body,要求標頭部叫做head。

GET傳遞參數,格式  /url?username=xxx&passwd=bbb  通過問號解析參數部分

url的傳遞參數是有限制的,每個瀏覽器限制都不一樣。url不允許有斷行符號換行



2POST 

POST也是一個請求操作,他的資料參數攜帶在http請求的body裡面。

所有的參數都不允許有斷行符號換行的存在, 很多時候如果必須要攜帶

斷行符號換行的話,必須先把資料轉換成base64編碼,因為它沒有斷行符號換成.他是解決網路傳輸的常用方法。





3http響應報文格式



1狀態代碼:請求是否成功,狀態代碼描述:成功或失敗的原因

有時候訪問一網頁 會出現404,這個404就是這個狀態代碼.




4http資料轉送模式

1傳輸中兩個重要的參數: 寫在頭裡面

transfer-encoding:identity,chunked表示當前這個body是什麼協議發過來的

content-length:length:資料包的長度



2identity 直接發送模式,length在後面表示資料長度


3chunked 模式,後面跟的是每一個chunk包 [包頭,包資料]

包頭:第一個位元組表示一個ASSIC資料,第二個位元組也是ASSIC資料

兩個位元組加起來,組成一個16進位資料。

後面兩個位元組,固定的0d0a(斷行符號分行符號)兩個位元組這4個位元組就是一個chunk的包頭,

後面的資料包 根據前面的兩個位元組來決定。資料包的結束標誌是

30  0d  0a  30ascll碼代表的是0

也就是說chunk包的結束:是遇到一個為等於0的chunk結束。

然後把這個包整合一下,形成完整的資料。





5http狀態代碼和表

/*

{

[100] = "Continue",

[101] = "Switching Protocols",

[200] = "OK",

[201] = "Created",

[202] = "Accepted",

[203] = "Non-Authoritative Information",

[204] = "No Content",

[205] = "Reset Content",

[206] = "Partial Content",

[300] = "Multiple Choices",

[301] = "Moved Permanently",

[302] = "Found",

[303] = "See Other",

[304] = "Not Modified",

[305] = "Use Proxy",

[307] = "Temporary Redirect",

[400] = "Bad Request",

[401] = "Unauthorized",

[402] = "Payment Required",

[403] = "Forbidden",

[404] = "Not Found",

[405] = "Method Not Allowed",

[406] = "Not Acceptable",

[407] = "Proxy Authentication Required",

[408] = "Request Time-out",

[409] = "Conflict",

[410] = "Gone",

[411] = "Length Required",

[412] = "Precondition Failed",

[413] = "Request Entity Too Large",

[414] = "Request-URI Too Large",

[415] = "Unsupported Media Type",

[416] = "Requested range not satisfiable",

[417] = "Expectation Failed",

[500] = "Internal Server Error",

[501] = "Not Implemented",

[502] = "Bad Gateway",

[503] = "Service Unavailable",

[504] = "Gateway Time-out",

[505] = "HTTP Version not supported",

}

*/





6使用http_parmer解析 URL讀取 然後返回給用戶端

//解析我們的http報文http_parser p;http_parser_init(&p,HTTP_REQUEST);http_parser_settings s;http_parser_settings_init(&s);//解析到了url 回調s.on_url = ws_on_url;//重設解析資訊init_ws_params();// 解析器執行。返回解析的位元組數http_parser_execute(&p,&s,http_req,len);//設定回呼函數switch (p.method)  //報文響應的方式{case HTTP_GET:{int len_URL = filter_url(WS_HTTP.url);//訪問的網頁  if (strncmp("/", WS_HTTP.url, len_URL) == 0){ //訪問test這個htmlstrncpy(WS_HTTP.url, "www_root/index.html", strlen("www_root/index.html"));}else if (strncmp("/test", WS_HTTP.url, len_URL) == 0){ //訪問預設的url 根目錄strncpy(WS_HTTP.url, "www_root/test.html", strlen("www_root/test.html"));}char* file_data = open_files(WS_HTTP.url);//發送報文  也就是響應用戶端//釋放記憶體free(file_data);}break;case HTTP_POST:break;}//endprintf("\n");讀取檔案static char* open_files(char* filename){//讀取這個檔案FILE* f = fopen(filename,"rb");//檔案大小int file_size = 0;fseek(f,0,SEEK_END);file_size = ftell(f);//指標又到檔案頭fseek(f, 0, 0);char* file_data = malloc(file_size + 1);fread(file_data, file_size,1, f);file_data[file_size] = 0;fclose(f);return file_data;}




7響應請求報文

//使用identity來發送響應報文 static voidwrite_ok_identity(int sock, char* body){int len = strlen(body);//使用直接模式 transfer-encoding:identitychar* send_line = malloc(len + 8096);memset(send_line, 0, sizeof(send_line));//回應http的頭sprintf(send_line, "HTTP/1.1  %d %s\r\n", 200, "OK");//設定頭部的一些資訊  比如傳送模式 body的長度char* walk = send_line;//跳過這個頭部walk = walk + strlen(walk);sprintf(walk,"transfer-encoding:%s\r\n","identity");//body的長度walk = walk + strlen(walk);  //頭結束sprintf(walk, "content-length: %d\r\n\r\n0", len);//寫入資料部分walk = walk + strlen(walk);sprintf(walk, "%s", body);//發送報文 響應  給用戶端send(sock, send_line, strlen(send_line), 0);free(send_line);walk = NULL;}





c語言實現簡單web伺服器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.