解決C# Socket發(fā)送數(shù)據(jù)大小問題
TCP/IP是可靠性傳輸協(xié)議,它能保證數(shù)據(jù)能按順序的方式到達(dá)目的地.看到以上描述在寫TCP/IP應(yīng)用的時(shí)候似乎就可以放心了,只要程序不出意外就數(shù)據(jù)輸傳就是正確.但最近在做一個(gè)文件傳輸工作的時(shí)候確得到的結(jié)果并不是這樣,發(fā)現(xiàn)網(wǎng)絡(luò)環(huán)境和一次發(fā)送數(shù)據(jù)大會(huì)影響整個(gè)輸傳結(jié)果.以下是這兩晚的測(cè)試情況
測(cè)試內(nèi)容描述:
每個(gè)文件塊信息包大概是120k左右
采用異步5連接輸傳,雙方的Socket.SendBufferSize和Socket.ReceiveBufferSize都設(shè)置為64K
測(cè)試服務(wù)器分別有:
局域網(wǎng):ServerA
在美國(guó)機(jī)房:ServerB 延時(shí)高,Ping有時(shí)會(huì)超時(shí)
測(cè)試client一臺(tái),通過(guò)ADSL上網(wǎng).
以下是Client從Sever下載文件的情況:
服務(wù)器8K SendBuffer,客戶端是8K ReceiveBuffer
從ServerA下載文件,分別下載多個(gè)文件幾M到幾百M(fèi)不等,下載后文件正確.
從ServerB下載文件,分別下載多個(gè)文件,幾M或更小的文件有部分正確,大文件基本都是錯(cuò)誤.兩端記錄的發(fā)送的字節(jié)數(shù)和接收的字節(jié)相等,符合文件大小,程序也沒有跟蹤到數(shù)據(jù)接收異常導(dǎo)致的協(xié)議分解錯(cuò)誤.
服務(wù)器4K SendBuffer,客戶端8K ReceiveBuffer
從ServerA下載文件,分別下載多個(gè)文件幾M到幾百M(fèi)不等,下載后文件正確.
從ServerB下載文件,分別下載多個(gè)文件,文件的正確率比較高,不過(guò)還是大文件相對(duì)錯(cuò)誤比較多.當(dāng)開啟迅雷下載后情況就開始變壞,大部分接收到的文件都出問題,兩端記錄的發(fā)送的字節(jié)數(shù)和接收的字節(jié)相等,符合文件大小,程序也沒有跟蹤到數(shù)據(jù)接收異常導(dǎo)致的協(xié)議分解錯(cuò)誤
服務(wù)器2K SendBuffer,客戶端8K ReceiveBuffer
從ServerA下載文件,分別下載多個(gè)文件幾M到幾百M(fèi)不等,下載后文件正確.
從ServerB下載文件,分別下載多個(gè)文件,下載結(jié)果沒有發(fā)現(xiàn)錯(cuò)誤文件.當(dāng)開啟迅雷下載后還是有個(gè)別文件錯(cuò)誤,兩端記錄的發(fā)送的字節(jié)數(shù)和接收的字節(jié)相等,符合文件大小,程序也沒有跟蹤到數(shù)據(jù)接收異常導(dǎo)致的協(xié)議分解錯(cuò)誤
服務(wù)器1K SendBuffer,客戶端8K ReceiveBuffer
從ServerA下載文件,分別下載多個(gè)文件幾M到幾百M(fèi)不等,下載后文件正確.
從ServerB下載文件,分別下載多個(gè)文件,下載結(jié)果沒有發(fā)現(xiàn)錯(cuò)誤文件.當(dāng)開啟迅雷下載后沒有發(fā)現(xiàn)文件錯(cuò)誤.
測(cè)試文件發(fā)送到Server和下載的情況基本差不多,這說(shuō)明了在網(wǎng)絡(luò)不好的情況處理發(fā)送大數(shù)據(jù)包似首容易產(chǎn)生錯(cuò)誤,但看TCP/IP協(xié)議講解這情況似乎不存在,因?yàn)楫?dāng)一個(gè)發(fā)送數(shù)據(jù)超過(guò)某個(gè)值的時(shí)候,TCP會(huì)劃分塊進(jìn)行傳輸并保證其順序.但網(wǎng)絡(luò)不好的情況測(cè)試結(jié)果接收的數(shù)據(jù)有錯(cuò)誤,但處理的數(shù)據(jù)大小是正確的,也并沒影響整個(gè)協(xié)議的分解.由于對(duì)CP/IP協(xié)議、低層和路由處理的不了解,暫沒找到具體原因。。。不排除程序存在還沒發(fā)現(xiàn)的錯(cuò)誤,打算給發(fā)送的文件數(shù)據(jù)加上校驗(yàn)再測(cè)試一下看情況
補(bǔ)充一下
以上測(cè)試只修改了一個(gè)屬性
TcpUtils.SendBufferLength = 1K,2K,4K,8K
但只有1K的測(cè)試結(jié)果奇怪地沒出現(xiàn)文件錯(cuò)誤,其了幾中均出現(xiàn)僅僅是對(duì)ServerB,對(duì)ServerA來(lái)說(shuō)沒有出現(xiàn),2K,4K也只是開啟迅雷的時(shí)候錯(cuò)誤情況多.
原文鏈接:http://www.cnblogs.com/smark/archive/2012/02/02/2335442.html
【編輯推薦】