如何利用socket進行HTTP訪問

2021-05-24 11:37:54 字數 2762 閱讀 3469

如何利用socket進行http訪問

平常我們要訪問某個

url一般都是通過瀏覽器進行:提交乙個

url請求後,瀏覽器將請求發向目標伺服器或者**伺服器,目標伺服器或者**伺服器返回我們所需要的資料,瀏覽器接收到這些資料後儲存成檔案並進行顯示。

下面我們看看如何自己利用

winsock2.h

中的介面來實現這個功能?為了簡化問題,作以下假設:

通過**伺服器進行

訪問,這樣就省去了對

url進行

dns192.168.0.1

:808。

這個功能由以下幾個部分組成:

1. 如何建立連線?

2. 如何傳送請求?

3. 如何接收資料?

4. 如何判斷資料接收完成?

下面我們依次來看下這些問題如何解決?

一、如何建立與伺服器之間的連線

基本tcp

,所以我們需要與伺服器建立連線,然後才能傳送資料。

建立連線參考如下函式

socket_open:

/* *開啟socket,返回socketid,-1表示失敗 */

intsocket_open(int ip,int port,int type)

memset(&serv_addr,0,sizeof (serv_addr));

serv_addr.sin_family=af_inet;

serv_addr.sin_addr.s_addr = ntohl(ip);

serv_addr.sin_port = htons((ushort)port);

status=connect(socketid,(struct sockaddr*)&serv_addr,sizeof (serv_addr));

if (status!=0)

return socketid; }

呼叫方式如下:

intsocketid=socket_open(

0xc0a80001,808,0);//0xc0a80001

是192.168.0.1的十六進製制寫法。

二、如何傳送請求

傳送資料要根據

協議的要求附加協議頭:

這裡使用get來獲取指定url的指定文件。

建立連線後使用send將這些資料傳送出去:

send(socketid, protocolhead,strlen(protocolhead),0);

傳送完成http請求後就等待接收資料。

三、如何接收資料

這裡採用

select

迴圈查詢的方式來判斷有無資料到來:

struct

timeval tm = ;

fd_set fds_r;

int status;

char recvbuf[4096]=;

fd_zero(&fds_r);

fd_set(socketid,&fds_r);

status=select(socketid+ 1, &fds_r, 0, 0, &tm);//socketid

在這裡是最大的fd

if (status > 0 && fd_isset(socketid, &fds_r))

這樣資料報就儲存到緩衝區中了。

四、如何判斷資料接收完成

首先對返回資料的狀態進行判斷,僅當狀態為「

」時才表明正確返回,這時才對資料進行解析並儲存,如果狀態為

或者其它狀態則表明沒有找到資源或者出現其它問題,可參考http 1.1狀態**及其含義

當資料正確返回時,為了將實際資料從協議中分離出來進行儲存,需要對

資料報進行解析得到

content-length

,然後在包含

content-length

的當前資料報或者隨後的資料報中查詢第乙個空行,這就是內容(

content

)的開始位置,再配合前面解析得到的

content-length

,就能夠知道什麼時候資料接收完成了。換行符為「

/r/n

」,也相容「

/n」或者「

/r」,設換行符為

^p,則空行如果位於內容中間或結尾則可查詢「

^p^p

」,若位於開頭,則查詢^p。

基本就是上面這些,這四個問題解決了,那麼整個問題也就解決了!

如何利用socket進行HTTP訪問

如何利用socket進行http訪問 平常我們要訪問某個 url一般都是通過瀏覽器進行 提交乙個 url請求後,瀏覽器將請求發向目標伺服器或者 伺服器,目標伺服器或者 伺服器返回我們所需要的資料,瀏覽器接收到這些資料後儲存成檔案並進行顯示。下面我們看看如何自己利用 winsock2.h 中的介面來實...

如何利用socket進行HTTP訪問

平常我們要訪問某個url一般都是通過瀏覽器進行 提交乙個url請求後,瀏覽器將請求發向目標伺服器或者 伺服器,目標伺服器或者 伺服器返回我們所需要的資料,瀏覽器接收到這些資料後儲存成檔案並進行顯示。下面我們看看如何自己利用winsock2.h中的介面來實現這個功能?為了簡化問題,作以下假設 這個功能...

如何利用socket進行HTTP訪問

平常我們要訪問某個url一般都是通過瀏覽器進行 提交乙個url請求後,瀏覽器將請求發向目標伺服器或者 伺服器,目標伺服器或者 伺服器返回我們所需要的資料,瀏覽器接收到這些資料後儲存成檔案並進行顯示。下面我們看看如何自己利用winsock2.h中的介面來實現這個功能?為了簡化問題,作以下假設 通過 伺...