|
socket編程阻塞的問題搞了我?guī)讉€月,這段時間實在是太漫長了,其實我只是需要一個很簡單的函數(shù),那就是獲取網(wǎng)頁源碼,就是一個這么簡單的需要,我搞了幾個月。 最初我把所有的socket函數(shù)放入一個線程,在線程中設(shè)置超時時間,但這樣會遇到一個問題,如果線程的超時時間設(shè)為30秒,30秒沒接收完成就表達(dá)失敗,但在正常情況下網(wǎng)頁文件在30秒內(nèi)也有可能接收不完,所以這個方法宣告失效。 接著又找了個Linux下的多線程下載軟件,研究了一下代碼,寫了個多線程的網(wǎng)頁文件下載,這又把問題弄得更復(fù)雜了,可能是我的代碼沒控制好,程序雖然不會阻塞了,但下載的網(wǎng)頁源碼偶爾會不完整,遇到這個問題又拖了我?guī)讉€月。 幾個月后開始用Delphi了,不是說Delphi的第三方控件多么,用了IdHttp、WinHttp、HTTPCli這三個控件。首先接觸的是IdHttp,對IdHttp的第一印象就不好,居然Get百度或Google都會出錯,雖然有辦法解決,但始終感覺不爽,所以棄之、接著使用WinHttp,這個控件沒怎么用,我把他做成DLL,然后在VC中調(diào)用,好像也出錯,用著用著就無法獲取網(wǎng)頁源碼了,不知是什么問題。最后是HttpCli這個控件,這是ICS組件包中的一個控件,雖然比前兩個控件好用些,但最近幾天又發(fā)現(xiàn)了一個問題,那就是有內(nèi)存泄漏,以前一直沒發(fā)現(xiàn)。我測試了一下,不停的用HttpCli獲取網(wǎng)頁源碼,程序的內(nèi)存占用一直在漲,每Get一次漲幾K到幾十K不等,我操!最后還是不得不用Socket寫,TNND,花了幾個月的時間繞了這么一大圈。 最后的解決辦法是用線程來解決超時的問題,socket的阻塞函數(shù)用得比較熟,非阻塞函數(shù)不太會用,所以就想了一招,connect、send、 recv這三個函數(shù)我都放在線程里,并設(shè)置線程的超時時間,其中recv是接收一次就創(chuàng)建一個線程,并等待線程結(jié)束,比如每recv一次,就最多等待10秒,如果超過10秒鐘,那就直接退出,這樣我看你媽的還怎么阻塞。 |
|
|