高分求解 關於 idTcpClient 傳文件的問題.


問題描述:
1.客戶端用idTcpClient 服務端是IOCP 當客戶端用一個鏈路傳輸多文件過程中,有的文件只能傳一半,有的可以   傳完. 當客戶端使用多個鏈路時(一個文件一個鏈路)時是可以全部傳完的.

2.客戶端用idTcpClient 服務端是idTcpServer 一個鏈路傳多文件是可以全部完成的.

根據以上原因,幫分析一下這是啥原因..分不夠再給..謝謝..

15 个解决方案

#1


協議定義清楚,不要串包就沒有問題.

#2


協議沒問題的,,雖說是一鏈路,但是收到包以后會根據包中的標記來分配數據包的.

#3


Send/Write指定的字節數並不一定能夠一次調用send就完成發送,從而如果要發送多個文件的話,必須保證第一個"包"(分片)在發送完成之前中間不會插入其它"包"

#4


上面的可能性我分析了一下也不存在,因為是一個鏈接,所以只有一個線程在接收數據,在收到對方的一個確認后才發第二個包(雖說是用了TCP,但是還是用的確認的這種方式),所以就算是多個文件分一塊發,在里面的執行過程其實是排着隊發出去的.

#5


好像和我遇到的問題相似,但是又不大一樣。
網絡傳輸需要考慮的因素他多了,建議:1、包要自己拆分和組裝;2、每個包的大小最好在1350字節以內(網絡設備的一個參數限制);

TCP協議是能夠自己拆分大包,但是有時候網絡環境復雜的話拆分的包可能走不同的網絡路由,導致接收
某一個小包的時候超時。。。
可以用tracert 跟蹤一下看看路由情況

在發送接收的時候要考慮socket buffer的大小是否修改成合適的大小了

#6


使用TCP就不應該存在丟包的情況,但是要做好異常處理,比如連接斷了,需要重傳,另外建議樓主最好一個連接傳一個文件,這樣邏輯處理比較簡單,便於維護,如果控制太多,不利於整個系統的穩定。

#7


引用 6 樓 Bear_hx 的回復:
使用TCP就不應該存在丟包的情況,但是要做好異常處理,比如連接斷了,需要重傳,另外建議樓主最好一個連接傳一個文件,這樣邏輯處理比較簡單,便於維護,如果控制太多,不利於整個系統的穩定。

up

#8


引用 4 樓 myart 的回復:
上面的可能性我分析了一下也不存在,因為是一個鏈接,所以只有一個線程在接收數據,在收到對方的一個確認后才發第二個包(雖說是用了TCP,但是還是用的確認的這種方式),所以就算是多個文件分一塊發,在里面的執行過程其實是排着隊發出去的.

是只有一個線程在發嗎?還是多個?如果是只有一個線程在發,就不會有類似問題,如果不是,那就不是那么回事。

#9


一個文件一個線程用來處理文件數據的讀寫,但是TCP只有一個線程來接收,接收到一個確認包后根據包的
標識派到相應的文件線程(數據包傳到文件線程時會把SOCKET傳進去),文件線程處理好后,進行發送下一包。
在這里面雖說每個文件一個線程,但是TCP只有一個接收線程,而且是接一個包處理一個包。這樣分析下去,最終發送時不會存在並發發送。今天在TCP的接收線程中,在處理完一個包以后加了一句sleep(0).加上去以后已經
正常,目前還在觀察中..請各位朋友繼續分析一下.另外我想把接收緩存再加大一點.目前是用的默認的8K吧.

#10


上面所說的正常是服務器和客戶端都在一台機器上是正常的,但是服務端放到其它服務器上測,還會出現以前的問題.郁悶透了..

#11


不清楚你們的IOCP當中是如何處理的,一般來說,IOCP當中對於同一個連接應該只保持一個未決的接收請求,從而保證能夠順序處理。

#12


是的,總會有一個接收請求在隊列里面的. 所以說在多個文件同時傳時,有的文件能順利傳完,有的只能傳一半.

#13


引用 12 樓 myart 的回復:
是的,總會有一個接收請求在隊列里面的. 所以說在多個文件同時傳時,有的文件能順利傳完,有的只能傳一半.

如果能夠保證同一時間僅有一個Recv請求,就不會存在這個問題。當然在處理的時候一定要有一個先后順序,同一個連接當中,當A線程收到數據並處理的時候,應該在該連接上加鎖,從而保證后續收到的數據能夠依序進行處理,而不會因為某種原因,A線程的處理還沒有完成,B線程的處理卻依先完成,導致亂序。

#14


嗯..謝謝僵哥一直對這個問題的關注,,不過A線程和B線程到開始接收文件時是順序執行的(雖說是線程,但是到后面開始接收文件時,線程已掛起了,是TCP接收線程調用他們的函數進行文件寫操作的),,所以不會存在A沒處理完,B已處理完的情況發生.

#15


哎..原因終於找到了,原來是IOCP服務器接收到的數據產生了粘包現像,我而接收一次只做為一個包處理, 
這樣接收緩存中的數據后一半會沒處理...真是郁悶啊..查了這么久..不過最終還是解決了,目前正在觀察中.

再次感謝各位朋友的支持.
散分...

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com