前言:
近期學習了服務器相關的開發,平常主要擼c的程序,所以就下定決心研究了c的服務器開發,目的也在與鞏固c的基本知識。詳細分享如下,若有錯誤請指正,希望與大家探討,共同學習進步。
(服務器搭建的框架)
一、關於http協議和xined服務
1. HTTP協議大致解析(概念就不在抄襲了):
請求服務器數據:
(1) GET /文件或目錄 HTTP/1.1
(2) 協議頭部分 (可選)
(3)\r\n(協議頭結束)
服務器應答瀏覽器:
(1)HTTP/1.1 200 OK
(2)content-Type:回寫客戶端的數據的類型
(3)content-Length:回寫文件的長度(確保正確性,不然會無法顯示文件)
(4) \r\n(協議頭結束)
(5)迴應帶數據包
2.HTTP常見的狀態碼和方法定義補充:
常見狀態碼:
(1)1xx:臨時響應並需要請求者繼續執行操作
(2)2xx:成功處理了請求的狀態碼
(3)3xx:需要進一步操作,重定向
(4)4xx:請求錯誤,妨礙了服務器的處理
(5)5xx:服務器在嘗試處理請求是發生內部錯誤
方法定義:
OPTIONS(返回服務器針對特定資源所支持的http的請求方法),
HEAD(向服務器索要與GET請求相一致的響應,響應體將不會被返回,
可以在不必傳輸整個響應內容的情況下,獲取響應消息頭中的元信息),
GET(向特定資源發出請求),
POST(向指定資源提交數據進行處理請求),
PUT(向指定資源位置上傳其最新內容),
DELETEL(請求刪除操作所標識的資源),
TRACE(回顯服務器收到的請求,診斷或測試),
CONNECTHTTP/1.1(預留將連接改爲管道方式的代理服務器)
3. xinetd 守護進程:
daemon系統中的一個後臺程序,週期性做的執行耨寫任務,等待某個shijian事件的發生,
不會隨用戶的註銷而退出。
創建守護進程:fork子進程,父進程結束,子進程setsid()脫離控制終端,修改權限文件描
述符,重定向dup2()
4. xinetd安裝,配置:
(1)在線安裝: sudo apt-get install xinetd
(2)判斷安裝是否成功:sudo aptitude show xinetd
(3)配置:sudo vi /etc/xinetd.d/xhttpd (注意三個統一)
sevice xhttpd
{
socket_type = stream (網絡套接字類型:流或者數據包)
protocol = tcp (ip協議,tcp,udp)
wait = no (取值 y?n)
user = nobody (運行進程的用戶ID)
server = /home/hao/xhttpd (執行的完整路徑)
server_args = /home/hao/file_dir (傳遞給server的值)
disable = no (用於默認的{}中禁止服務)
flags = IPv4 (所使用的互聯網協議)
}
(4) sudo vi /etc/services 在其中加入端口號(注意端口號不能與系統重用)
xhttpd 8000/tcp #serverxhttpd 8000/udp #server
(5) 重啓xinetd 服務器 sudo service xinetd restart(6) 查看運行狀態 ps aux | grep xinetd
5. 分析xhttpd服務器實現功能:
xinetd 在啓動 xhttpd 可執行文件時,傳入參數argv[1]---》配置文件server_args的值
eg:./xhttpd /home/hao/dir/photo.jpg
chdir();改變工作目錄 ---》 拼接 訪問文件的絕對路徑訪問
讀取 http的協議頭,解析出請求的文件名
標準輸入中讀取,
得到請求文件名或者目錄
判斷文件是否存在:
存在:
判斷待請求文件是什麼類型:(1)目錄:返回目錄列表,尋求對應的文件名稱
(2)文件:寫回應http協議頭 回寫文件內容
----------------------------------------------------------------------------------------------------------
<下節: 關於具體代碼xhttp執行文件的代碼詳解>