当前位置:编程学习 > C#/ASP.NET >>

c#tcp传输大文件出现乱码

我用tcplistener,tcpclient ,networkstream进行文件传输,在广域网内,如果传输小文件就正常,传大文件就出现乱码?
我在本机上测试正常,我在广域网内进行传输,传输几百kb的小图片文件没问题,但是传输1mb大的图片,客户端接受的时候,就出现乱码,一个文件被分成几部分。这是怎么了,谢谢大家,
qq:524300045 --------------------编程问答-------------------- 对了,我的源代码在这里,大家帮我改改,谢谢了
http://61.50.146.143/fs/fserver.rar --------------------编程问答-------------------- 丢包了吧.加上校验机制. --------------------编程问答-------------------- 怎么加校验机制,我传小文件没问题呀,能不能给我发一个完整的异步传输文件的源代码,谢谢
524300045@qq.com --------------------编程问答-------------------- 晕,TCP协议本来就是提供可靠的并且无差错的通信服务,适用于小报文的传输,大数据量用UDP --------------------编程问答-------------------- 为什么都喜欢用TCP传大文件。。。。 --------------------编程问答-------------------- 传送文件当然需要使用TCP啦,UDP是不可靠协议用来传送文件更加不安全不稳定。
大文件出现问题我估计是你在发送数据块分割的时候,数据块边界出现了问题。
另外你在TCP连接后双方接收数据的时候注意字符编码接收问题。 --------------------编程问答-------------------- up
--------------------编程问答-------------------- 我的理解是这样的
传输大的文件的时候,开始的时候(较短的一段时间之内)不会出现乱码的现象,后面就出现了乱码的现象,就是说,持续不断的传输大量数据,导致网络繁忙,比如N个循环传一个100B的buffer,后面由于网络忙,socket就会将它分为两个(或者更多)的小包(即报文)进行传输,而在客户端接收这些小包的顺序并不是按照从前到后的顺序,即,先收到的包就先拆开,也就导致了在客户端接收数据出现了乱码的问题 --------------------编程问答--------------------
引用 8 楼 emyueguang 的回复:
我的理解是这样的
 传输大的文件的时候,开始的时候(较短的一段时间之内)不会出现乱码的现象,后面就出现了乱码的现象,就是说,持续不断的传输大量数据,导致网络繁忙,比如N个循环传一个100B的buffer,后面由于网络忙,socket就会将它分为两个(或者更多)的小包(即报文)进行传输,而在客户端接收这些小包的顺序并不是按照从前到后的顺序,即,先收到的包就先拆开,也就导致了在客户端接收数据出现了乱码的问题

那个是UDP的问题。TCP有机制来保护。

建议lz研究一下FTP之类的方式来传输大文件,单纯TCP的方式原理上也不会出问题,只是没人有时间看你的代码错在哪里。 --------------------编程问答-------------------- ding... --------------------编程问答--------------------
引用 9 楼 lextm 的回复:
引用 8 楼 emyueguang 的回复:
我的理解是这样的
传输大的文件的时候,开始的时候(较短的一段时间之内)不会出现乱码的现象,后面就出现了乱码的现象,就是说,持续不断的传输大量数据,导致网络繁忙,比如N个循环传一个100B的buffer,后面由于网络忙,socket就会将它分为两个(或者更多)的小包(即报文)进行传输,而在客户端接收这些小包的顺序并不是按照从前到后的顺序,即,先收到的包就先拆开,也就导致了在客户端接收数据出现了乱码的问题

那个是UDP的问题。TCP有机制来保护。

建议lz研究一下FTP之类的方式来传输大文件,单纯TCP的方式原理上也不会出问题,只是没人有时间看你的代码错在哪里。


这个说的中肯 楼主可以考虑 --------------------编程问答-------------------- 不过是网络的问题,不是tcp的问题

非对称丢包特性对TCP吞吐量的影响 
http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece76310478027474380146b80c7150892d213cf3101061471e3cc70745713d3b22d3b1ccf1e1eb7b0706f44426be6fdb9ea57aefad97949f94523706bc41746c75cf28b102a8771d24de9de0e97bee741e0b9a2d1c82022&p=876dc64ad7934ea81efe88127f&user=baidutcp也会丢包,
2. 非对称信道对TCP产生影响的方面 
。。。
2) 增加前向链路突发.由于受拥塞窗口的限制,TCP只有在收到新的有效确认时,
才能发送新的数据包.再回传路径带宽不足或高误码率是,很容易发生确认包丢
失.而本该发送的新数据,由于确认包丢失则不能发送.当后续确认到达源端时,
原来待发的数据就会和新确认所对应的数据包同时发出,造成突发.当丢失较多
的确认包后有效确认到达时,源端就有可能在短时间内发送过多的数据,造成前
向链路缓存溢出,产生丢包. 

TCP会不会丢包?
http://bbs2.chinaunix.net/thread-610986-1-1.html
至于丢包,是因为网络曾或者数据链路层或者物理层造成的。如果是因为TCP协议本身的问题,接收端会发送icmp差错报告,报告发送端TCP协议不可达.
如果包没有按顺序到达,譬如编号1,5,而没有收到2,3,4,应用程序直到2,3,4都到达的时候才会读取。
对于已经建立的连接,如果长时间没有数据交流,也会终止链接,释放tcp协议所开辟的缓存。

【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? http://www.cnblogs.com/xuyuan77/archive/2008/06/11/1217416.html
4 楼youngwhz(sunbird)回复于 2003-09-23 13:58:19 得分 20
比如发送文件。记得有人提过可能会发生什么堆栈溢出。??? 
TCP传输是可以保证数据交换的可靠性的,但这是指一方的主机将数据正确的传输到目标机器中,目标机器的协议栈的堆栈是有一定限制的,如果在目标机器中不及时处理接收到的数据,有可能堆栈会溢出!而这种溢出并不是因为TCP协议本身,而是因为系统的IP协议栈的缓冲区溢出造成! 
--------------------编程问答-------------------- tcp也会丢包 不过是网络的问题,不是tcp的问题 
--------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 乱码跟tcp协议无关,本身tcp提供的就是可靠连接,需要三次握手,需要保证数据传输完整性。应该是你接收端代码问题,比如过多的数据流导致的问题 --------------------编程问答--------------------
一次发送数据并不是一个数据包,Tcp没有数据包的概念,是基于流的

用流操作就可以了
while(true)
{
receivedLength = socket.Recive(bytes, 0, length);
if(receivedLength == 0) break;
fs.Write(bytes, 0, receivedLength);
}
fs.Close();
ShowMessage("传输完成"); --------------------编程问答-------------------- 1.大文件传输时是怎么传的?是分块吗?我以前传文件也出现过类似的情况,后来整个文件一次传输出去没有问题。
2.打开二进制文件分析一下,看看有没有什么特殊的地方。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 分块,每块加上标识这块属于哪个位置,数据大小。
我最近做了个UDP的。 --------------------编程问答-------------------- 1楼给的源代码我下载不了。不知道楼主用的是不是VS2008,我有个VS2008下的文件传输代码可供参考,在我的上传资源里。 --------------------编程问答-------------------- 兄弟,知足吧,我现在只能传8k以下的…… --------------------编程问答-------------------- 靠。 --------------------编程问答--------------------
引用 19 楼 sharpe 的回复:
分块,每块加上标识这块属于哪个位置,数据大小。
我最近做了个UDP的。


兄弟是否可以说说你的UDP呢?
方便的话贴代码出来大家瞧瞧? --------------------编程问答--------------------
引用 12 楼 wartim 的回复:
不过是网络的问题,不是tcp的问题


TCP会不会丢包?
http://bbs2.chinaunix.net/thread-610986-1-1.html
至于丢包,是因为网络曾或者数据链路层或者物理层造成的。如果是因为TCP协议本身的问题,接收端会发送icmp差错报告,报告发送端TCP协议不可达.
如果包没有按顺序到达,譬如编号1,5,而没有收到2,3,4,应用程序直到2,3,4都到达的时候才会读取。
对于已经建立的连接,如果长时间没有数据交流,也会终止链接,释放tcp协议所开辟的缓存。


似乎TCP是有校验的,这种丢包现象几率很小。 --------------------编程问答-------------------- 楼主给的源码下载不了。不过TCP socket在接收的时候有可能会有粘包现象,不知道楼主有没有自己把数据切块,并且记录每次发送的数据包的长度。如果单纯把数据直接发送出去,然后直接接收,而不判断长度,有可能在重新组包的时候出错 --------------------编程问答-------------------- 这样的问题最好是把大文件分包发送.一次发送不要超过4K.在客户接收的时候按照你发送的顺利来接受.不过要处理粘包的问题. --------------------编程问答-------------------- 这样的问题最好是把大文件分包发送.一次发送不要超过4K.在客户接收的时候按照你发送的顺利来接受.不过要处理粘包的问题.

我发送大文件 超过了1G在网络上都没有问题.就是采用的这样的方法. --------------------编程问答-------------------- 分批分期有组织有计划的传输。
--------------------编程问答-------------------- http://download.csdn.net/detail/czwwzc0184211/4030080   这里有Tcp传送文件的小例子!
解决了Tcp粘包问题,无论发大文件,小文件都没问题!可以看看! --------------------编程问答-------------------- 2009年的贴……楼主好耐心。。。。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,