堅持每天乙個小程式(web伺服器)

2022-09-20 02:36:13 字數 2266 閱讀 4302

剛接觸網路不深,寫了個基本的web伺服器,由於剛找到工作,也只能在週末把文章整理下了。

實現乙個web伺服器步驟:

第一步,我們要做的就是指定好相應的埠和網頁存放目錄

我設定好的預設目錄是程式存放的目錄裡的html/資料夾裡。

埠的話如果你在執行的時候指定的話,就在執行時加引數,否則預設是8000.(1024號埠以下要sudo才能執行程式)

http協議的基本格式:

首先由瀏覽器傳送給伺服器如下報文:

get / http/1.1 (如果輸入了檔名,則在這裡顯示,預設是index.html)

host: 192.168.0.3:8000

user-agent: mozilla/5.0 (x11; u; linux i686; en-us; rv:1.8.1.6) gecko/20061201 firefox/2.0.0.6 (ubuntu-feisty)

accept-language: en-us,en;q=0.5

accept-encoding: gzip,deflate

accept-charset: iso-8859-1,utf-8;q=0.7,*;q=0.7

keep-alive: 300

connection: keep-alive

伺服器收到請求後開啟執行緒,以併發的形式處理瀏覽器發過來的請求。

執行緒試著開啟瀏覽器所請求的檔案

如果成功:

傳送以下報文

並傳送檔案中的內容

如果失敗:

傳送失敗報文:

以下附著自己寫的程式:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//執行緒傳參不能傳指標,因為伺服器的請求砂快,會更新socket描述符的記憶體

//執行緒處理網頁伺服器請求

void *web_handler(void *arg)

int fd = open(filename, o_rdwr);

if(fd < 0)

char ok_buf = "http/1.1 200 ok\r\n" \      //正確的報備

"content-type: text/html\r\n" \

"\r\n";

send(client_fd, ok_buf, strlen(ok_buf), 0);

int len;

while( (len = read(fd, buf, sizeof(buf))) > 0)

close(client_fd);

return null;

}int main(int argc, char *ar**)

//socket

int sock_raw_fd = socket(af_inet, sock_stream, 0);

if(sock_raw_fd < 0)

//bind

struct sockaddr_in server_addr, client_addr;

bzero(&server_addr, sizeof(server_addr));

server_addr.sin_port = htons(port);

server_addr.sin_family = af_inet;

server_addr.sin_addr.s_addr = htonl(inaddr_any);

int errlog;

if ( (errlog = bind(sock_raw_fd, (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)

//listen

if( (errlog = listen(sock_raw_fd, 10)) < 0)

while(1)

}return 0;

}

每天乙個小程式(9) 鏈隊

include include typedef int datatype typedef struct node qnode typedef struct lqueue 鏈隊 初始化 lqueue init lqueue 入隊 void in lqueue lqueue q,datatype x 判...

每天乙個python小技巧

使用場景 如果需要多次重複的產出檔案,可以通過如下的方式來根據時間戳建立新的資料夾,用來區分儲存檔案。def getcurrenttime dirpath 根據時間戳,建立指定輸出檔案 param dirpath return if os.path.exists dirpath time.strft...

每天乙個shell小知識(for)

在實際工作環境中,經常會遇到某項任務需要多次執行的情況,而每次執行時僅僅是處理的物件不一樣,其他命令完全相同。如 根據伺服器清單檢查各個主機的存活狀態 根據ip位址黑名單設定拒絕訪問的防火牆策略等。這樣繁瑣的重複任務時,if語句已經不能滿足需求。則我們需要for迴圈語句。使用for迴圈時,需要指定乙...