剛接觸網路不深,寫了個基本的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迴圈時,需要指定乙...