在WM5.0下,通過移動(dòng)的網(wǎng)關(guān)發(fā)送GET請(qǐng)求,其實(shí)現(xiàn)方法有以下兩種:用微軟封裝的CInternetSession、CHttpFile類和用SOCKET。
用微軟封裝的CInternetSession、CHttpFile類,必須要給VC8打上SP1補(bǔ)丁,這個(gè)補(bǔ)丁裝起來比較費(fèi)事;另外必須采用異步(多線程),否則會(huì)超時(shí)收不到數(shù)據(jù),這是微軟的一個(gè)BUG;在接收數(shù)據(jù)時(shí),如果采用C++標(biāo)準(zhǔn)的流操作,那么在解析數(shù)據(jù)時(shí)很有可能出現(xiàn)亂碼,這個(gè)問題出現(xiàn)的不明顯,但是在大數(shù)據(jù)時(shí),出現(xiàn)的機(jī)率很大,用了一天的時(shí)間才發(fā)現(xiàn)是緩沖的原因,在最后一次向文件中寫數(shù)據(jù)時(shí),如果數(shù)據(jù)不足以填充整個(gè)緩沖區(qū),那么文件中很有可能有亂碼,由于這個(gè)錯(cuò)誤有很大的偶然性,所以很難察覺,建議用MFC封裝好的文件類。
用SOCKET將數(shù)據(jù)封裝成HTTP格式發(fā)送到服務(wù)器端,在程序或進(jìn)程第一次發(fā)送GET請(qǐng)求時(shí),要發(fā)兩次,第一次收到的是移動(dòng)網(wǎng)關(guān)發(fā)給客戶端的數(shù)據(jù),以后發(fā)一次就可以,要格外注意的是,在連續(xù)發(fā)數(shù)據(jù)時(shí),要先關(guān)掉SOCKET在發(fā),然后再發(fā);在發(fā)送完數(shù)據(jù),必須要Sleep上幾秒,等待接收完數(shù)據(jù),這和異步類似;它的接收文件,如果要用文件操作,也建議用MFC封裝的類,如果接收的數(shù)據(jù)比較大時(shí)。
綜上所述,兩種方法的本質(zhì)其實(shí)沒什么差別,只是用SOCKET可能比較簡(jiǎn)單,其他的如用ACE,其原理都一樣,還是得異步或多線程。另外在用SOCKET時(shí),接收到的文件中含有以前接收的數(shù)據(jù),但是在讀文件時(shí)確只有本次接收的數(shù)據(jù),這一點(diǎn)要注意。