windows 利用socket實現從http下載?
用c++實現 希望大神能告訴我都需要哪幾步 我在網上查到的都是關於創建socket和請求頭的詳細描述 請告訴我主文件里怎麼去寫
補充:不能用微軟封裝好的類 就是要任性的用socket
在Windows下就不要用socket了,用這個API About WinHTTP (Windows) 簡單粗暴,三下五除二搞定。
http下載的本質(一般情況下)是用tcp發送一個請求包,請求類型為GET,然後接收服務端的返回,保存為文件即可。
裝一個抓包工具(如wireshark),隨便去下載一幅圖片,即可看到完整的包。自己實現無非是拼接請求包,解析返回包而已。
ps:自行實現的話最少也得用個非同步io模型,不然超時控制之類的都不好做,不具有實用性。
ps:windows自帶的URLDownloadToFile函數有隱含問題,最好不要用。
這麼傲嬌~~~真的好任性,直接無視了V神~~
1、SOCKET API都搞熟了嗎?那麼開始吧
2、URL規範知道吧?然後你知道怎麼把主機名、埠、請求的URI和參數按規範解析出來。
3、主機名也有可能是域名,不是IP,發起HTTP連接時得先知道怎麼DNS解析域名,把IP搞出來。
4、好吧,IP和埠都有了,建立TCP連接吧~~(TCP的SOCKET選項自己查API設置吧)
3、HTTP協議的知識準備好了嗎?那就開始吧
3.1 連接創建好了,按協議規範設置好請求消息頭就可以發起HTTP請求了,然後處理各處請求異常
3.2 有結果返回了,得先把消息頭解釋出來,下邊解析時有用,知道消息頭與消息體的分界線。
3.4 數據傳輸模式是chunk方式還是直接指定了位元組數了?chunk的話了,你就得從消息體裡邊自己解析出來長度。
3.5 拿到數據了,還要考慮數據是不是壓縮過的?如果壓縮了還得解壓吧,解壓用zlib吧了,這個你不能任性自己寫了。
3.6 然後,你想怎麼處理就怎麼處理了~~~
處理過程大概就是醬紫,可以先按這個過程自己試著寫個架子試試吧~~用什麼數據結構處理數據自己看著選吧~
如果這個處理過程還有問題,歡迎指正或補充~~
不知道是不是題主想要的~~~不是的話,摺疊我吧~~~
寫過一個關於cpp通過socket發出http請求的代碼,不知道能不能幫上忙
http://www.windgreen.me/%e7%94%a8cpp%e5%ae%9e%e7%8e%b0http%e8%af%b7%e6%b1%82
要理解的是,socket是基於tcp/ip協議,作用於傳輸層,而http是應用層協議。
最最重要的,http是文本協議,可以說是非常直觀和簡單的了。舉例子,tcp協議等其他底層協議是面向bit的,每個bit都可能有獨特的意義。而http是面向文本的,簡單說就是字元串,比如header的鍵值對,比如用
做分隔符,比如文件分隔符等等~
總結說,只要能傳輸字元串,就能發起http請求。
最後,文件下載還沒研究過-_-||
推薦閱讀:
※想問下php的socket的工作流程是什麼?
※Socket是一個好的設計嗎?
※有沒有哪些高效的c++ socket框架?
※Socket建立連接到底發生了什麼?
※怎麼理解TCP是面向連接的,HTTP基於TCP卻是無連接的?