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