[導讀]說到web服務器想必大多數人首先想到的協(xié)議是http,那么http之下則是tcp,本篇文章將通過tcp來實現一個簡單的web服務器。本篇文章將著重講解如何實現,對于http與tcp的概念本篇將不過多講解。一、了解Socket及web服務工作原理既然是基于tcp實現web服務器,很...
說到 web 服務器想必大多數人首先想到的協(xié)議是 http,那么 http 之下則是 tcp,本篇文章將通過 tcp 來實現一個簡單的 web 服務器。本篇文章將著重講解如何實現,對于 http 與 tcp 的概念本篇將不過多講解。
一、了解 Socket 及 web 服務工作原理
既然是基于 tcp 實現 web 服務器,很多學習 C 語言的小伙伴可能會很快的想到套接字 socket。socket 是一個較為抽象的通信進程,或者說是主機與主機進行信息交互的一種抽象。socket 可以將數據流送入網絡中,也可以接收數據流。socket 的信息交互與本地文件信息的讀取從表面特征上看類似,但其中所存在的編寫復雜度是本地 IO 不能比擬的,但卻有相似點。在 win 下 socket 的交互交互步驟為:WSAStartup 進行初始化--> socket 創(chuàng)建套接字--> bind 綁定--> listen 監(jiān)聽--> connect 連接--> accept 接收請求--> send/recv 發(fā)送或接收數據--> closesocket 關閉 socket--> WSACleanup 最終關閉。了解完了一個 socket 的基本步驟后我們了解一下一個基本 web 請求的用戶常規(guī)操作,操作分為:打開瀏覽器-->輸入資源地址 ip 地址-->得到資源。當目標服務器接收到該操作產生掉請求后,我們可以把服務器的響應流程步驟看為:獲得 request 請求-->得到請求關鍵數據-->獲取關鍵數據-->發(fā)送關鍵數據。服務器的這一步流程是在啟動socket 進行監(jiān)聽后才能響應。通過監(jiān)聽得知接收到請求,使用 recv 接收請求數據,從而根據該參數得到進行資源獲取,最后通過 send 將數據進行返回。二、創(chuàng)建sokect完成監(jiān)聽
2.1 WSAStartup初始化首先在c語言頭文件中引入依賴 WinSock2.h:#include?
在第一點中對 socket 的創(chuàng)建步驟已有說明,首先需要完成 socket 的初始化操作,使用函數 WSAStartup,該函數的原型為:int?WSAStartup(
??WORD??????wVersionRequired,
??LPWSADATA?lpWSAData
);
該函數的參數 wVersionRequired 表示 WinSock2 的版本號;lpWSAData 參數為指向 WSADATA 的指針,WSADATA 結構用于 WSAStartup 初始化后返回的信息。wVersionRequired 可以使用 MAKEWORD 生成,在這里可以使用版本 1.1 或版本2.2,1.1 只支持 TCP/IP,版本 2.1 則會有更多的支持,在此我們選擇版本 1.1。首先聲明一個 WSADATA 結構體 ?:WSADATA?wsaData;
隨后傳參至初始化函數 WSAStartup 完成初始化:WSAStartup(MAKEWORD(1,?1),?
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。