當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導(dǎo)讀]說到web服務(wù)器想必大多數(shù)人首先想到的協(xié)議是http,那么http之下則是tcp,本篇文章將通過tcp來實現(xiàn)一個簡單的web服務(wù)器。本篇文章將著重講解如何實現(xiàn),對于http與tcp的概念本篇將不過多講解。一、了解Socket及web服務(wù)工作原理既然是基于tcp實現(xiàn)web服務(wù)器,很...

說到 web 服務(wù)器想必大多數(shù)人首先想到的協(xié)議是 http,那么 http 之下則是 tcp,本篇文章將通過 tcp 來實現(xiàn)一個簡單的 web 服務(wù)器。

本篇文章將著重講解如何實現(xiàn),對于 http 與 tcp 的概念本篇將不過多講解。

一、了解 Socket 及 web 服務(wù)工作原理

既然是基于 tcp 實現(xiàn) web 服務(wù)器,很多學(xué)習(xí) C 語言的小伙伴可能會很快的想到套接字 socket。socket 是一個較為抽象的通信進程,或者說是主機與主機進行信息交互的一種抽象。socket 可以將數(shù)據(jù)流送入網(wǎng)絡(luò)中,也可以接收數(shù)據(jù)流。

socket 的信息交互與本地文件信息的讀取從表面特征上看類似,但其中所存在的編寫復(fù)雜度是本地 IO 不能比擬的,但卻有相似點。在 win 下 socket 的交互交互步驟為:WSAStartup 進行初始化--> socket 創(chuàng)建套接字--> bind 綁定--> listen 監(jiān)聽--> connect 連接--> accept 接收請求--> send/recv 發(fā)送或接收數(shù)據(jù)--> closesocket 關(guān)閉 socket--> WSACleanup 最終關(guān)閉。

了解完了一個 socket 的基本步驟后我們了解一下一個基本 web 請求的用戶常規(guī)操作,操作分為:打開瀏覽器-->輸入資源地址 ip 地址-->得到資源。當目標服務(wù)器接收到該操作產(chǎn)生掉請求后,我們可以把服務(wù)器的響應(yīng)流程步驟看為:獲得 request 請求-->得到請求關(guān)鍵數(shù)據(jù)-->獲取關(guān)鍵數(shù)據(jù)-->發(fā)送關(guān)鍵數(shù)據(jù)。服務(wù)器的這一步流程是在啟動socket 進行監(jiān)聽后才能響應(yīng)。通過監(jiān)聽得知接收到請求,使用 recv 接收請求數(shù)據(jù),從而根據(jù)該參數(shù)得到進行資源獲取,最后通過 send 將數(shù)據(jù)進行返回。

二、創(chuàng)建sokect完成監(jiān)聽

2.1 WSAStartup初始化

首先在c語言頭文件中引入依賴 WinSock2.h:

#include?
在第一點中對 socket 的創(chuàng)建步驟已有說明,首先需要完成 socket 的初始化操作,使用函數(shù) WSAStartup,該函數(shù)的原型為:

int?WSAStartup(
??WORD??????wVersionRequired,
??LPWSADATA?lpWSAData
)
;
該函數(shù)的參數(shù) wVersionRequired 表示 WinSock2 的版本號;lpWSAData 參數(shù)為指向 WSADATA 的指針,WSADATA 結(jié)構(gòu)用于 WSAStartup 初始化后返回的信息。

wVersionRequired 可以使用 MAKEWORD 生成,在這里可以使用版本 1.1 或版本2.2,1.1 只支持 TCP/IP,版本 2.1 則會有更多的支持,在此我們選擇版本 1.1。

首先聲明一個 WSADATA 結(jié)構(gòu)體 ?:

WSADATA?wsaData;
隨后傳參至初始化函數(shù) WSAStartup 完成初始化:

WSAStartup(MAKEWORD(1,?1),?
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉