2016-09-20 253 views
2

這是我學習的服務器:http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.htmlC http服務器發送請求到我的服務器?

我完全不明白get請求服務器之類的東西。我如何發送獲取請求?我不認爲我知道如何做到這一點的原因是,所有教程都指向從網站獲取請求,而這是從我當前的目錄或至少從我的理解。

這是一個學校作業,我們被允許爲該作業複製代碼,但是我們必須找出作者。重點在於瞭解Web服務器的工作原理,我不理解Get請求的作用,以及如何在特定的服務器中實現它,以便研究其效果。

謝謝你,下面是我想打的具體代碼。我想測試不同的獲取請求,以查看我可以獲得哪些響應或錯誤。

if ((fd=open(path, O_RDONLY))!=-1) 
{ 
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
    while ((bytes_read=read(fd, data_to_send, BYTES))>0) 
     write (clients[n], data_to_send, bytes_read); 
} 
else write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND 
+1

爲什麼要從服務器發送*請求*?客戶端發送請求,並回復響應。 –

+0

至於創建請求,只需讓你的本地瀏覽器做到這一點?或者使用像'curl'這樣的命令行工具? –

+0

就像我說的我不知道我在做什麼,我不知道有關服務器的第一件事。客戶發送請求,我回復。我確定這個服務器已經有回覆。curl命令是什麼樣的? http://stackoverflow.com/questions/27422918/send-http-get-request-using-curl-in-c顯示一個。但是,我甚至不知道這是否有一個網址,如果它做到了 – TheMangaStand

回答

0

查看HTTP 1.1 RFC#GET瞭解GET請求是什麼。當您使用瀏覽器訪問網站時(所有網站都在某種HTTP服務器上運行),您的瀏覽器充當客戶端,網站充當服務器。客戶端啓動請求,服務器響應該請求。

請求的主要類型(由瀏覽器響應用戶試圖查看的URL發起)是GET請求。

例如,如果用戶想要訪問URL http://www.example.com/index.htm,瀏覽器會連接到服務器www.example.com的TCP端口80(默認情況下)。一旦連接成功,瀏覽器啓動的「對話」與標準的GET請求看起來像這樣的:

GET /index.htm HTTP/1.1 
Host: www.example.com 
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

第一行(請求行)之後的任何頭是可選的,儘管任何瀏覽器總是希望以包含「主機」標題,因爲沒有它,大多數網站將無法工作(這允許多個網站共享一個IP地址)。在這種情況下,服務器無法知道您嘗試訪問的網站,而無需在此處指定主機名。

最低限度GET請求來獲取該服務器上的index.htm將僅僅是:

GET /index.htm HTTP/1.1 

注意,請求結束是由一個雙CRLF序列終止(ASCII碼13和10) ,一個用於最近的標題行,另一個用於標記請求標題的結尾。一旦服務器收到雙CRLF序列,服務器就會響應相應的狀態行和代碼(找到該文檔?)。如果找到文檔,它通常會以HTTP狀態代碼200的響應形式返回,響應標頭(與請求標頭格式相同),雙CRLF序列,後跟所請求文件的正文。 HTTP標準稱這爲「實體」。在這種情況下,返回的實體將是index.htm的內容。使用上面的例子中,服務器可能會這樣回答:

HTTP/1.1 200 OK 
Content-Type: text/html 
Content-Length: 66 
Last-Modified: Wed, 14 Sep 2016 13:05:21 GMT 

<html> 
<body> 
    Welcome to my example page 
</body> 
</html> 

所以這是一言以蔽之的HTTP GET /響應對話的一個簡單的例子,雖然你可以猜測,事情可能會變得更加複雜,這取決於請求和響應頭。

要回答您關於如何手動向正在運行的服務器發送GET請求的問題,我喜歡在Linux機器上使用「curl -i」。 Curl充當客戶端/瀏覽器,允許您指定要獲取(下載)的URL。例如:

-i選項將導致捲曲以顯示整個網絡服務器響應(包括HTTP響應報頭),而不是僅僅在這種情況下是TEST.HTM的內容的實體。只需要調整上面的URL以匹配正在運行的Web服務器的URL,無論它位於同一臺計算機上還是網絡上的其他位置。