找回密码
 加入怎通
查看: 530|回复: 1

[关于百度] 解决C# Socket发送数据大小而影响整个传输的问题

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况
2 ]) L7 n& v# n9 N/ A6 O8 G
8 O5 v- E4 n: E' ~) y$ R# X0 c  测试内容描述:
: K/ m# O8 Z3 |2 _& H) x! S' Y0 V4 Z' l2 F
  每个文件块信息包大概是120k左右
  i+ a$ K( I4 e$ U/ m4 {! v8 Y, W1 F$ X5 p
  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K+ j- y1 [% I; J& F0 L! ]7 d* h2 F+ P

: `) h' r" t- ?3 n3 l, r  测试服务器分别有:
7 j: h: S; S8 y( f$ T
- [1 d/ g! c+ e  _* c" n$ o  局域网:ServerA+ x& d' ~3 q8 [3 W7 f
0 O8 f+ d# ^$ R+ z5 U, N
  在美国机房:ServerB 延时高,Ping有时会超时
2 r+ _5 R4 c& H. a5 v' x8 c
2 D8 ^6 K% C8 H" F6 W  测试client一台,通过ADSL上网.
' y; G( L8 Z9 V, h( R* U1 G6 I4 F( w/ \) N5 |8 G0 R$ F
  以下是Client从Sever下载文件的情况:
+ @9 n! V" ]3 r% r9 K
+ u3 T- ^1 e1 i9 y( M  服务器8K SendBuffer,客户端是8K ReceiveBuffer
2 I6 U+ w& V* u' w
4 A; o) A% F4 e9 P' B5 Z! ]  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
/ z' d  x! t3 `# G$ k. [, W, D% B. D; c3 x+ T/ m
  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.0 n  K% p; w: a: C6 y& Q
# ?+ ^* s1 ?! `* F' t! ]
  服务器4K SendBuffer,客户端8K ReceiveBuffer- v& i& W; ^% _- P6 P5 ]9 _( M

; o; A, t) {. l5 [1 x; ]- G  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.9 F6 a% w0 k  |) Q" w

) O8 S8 c0 D- _' s) F7 b  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
, U4 o; Z8 z2 V; }3 z* m7 @$ ]* \# ^/ d" ^- Q$ R- L
  服务器2K SendBuffer,客户端8K ReceiveBuffer
1 d  v9 ]8 Y8 o
9 u$ N0 I% X3 W+ ~; M  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.8 l/ |) T( ?9 B" C
8 U6 _& G6 _0 ^# W$ A
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
+ [, Y- B. m7 [9 j' ^' R* f7 U' R/ h! D; K
  服务器1K SendBuffer,客户端8K ReceiveBuffer. E7 N8 f. A' `" F

, R% y9 l6 {: }) H) P+ S' r; v' a  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.; N3 I: @: a7 |. Y; U
  w- s9 Z4 G' @" p3 S
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
  e8 U0 }) l1 e9 q
% w  j; u+ h2 K& o% I  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
' ^, v2 C7 h, j2 O! f8 o: {4 Z) j' A8 ~" w: I# \- s
  补充一下5 s6 X9 b. H+ l' o1 v5 ?8 L) p

( _/ U* x& D; G  d1 ^6 P7 J  以上测试只修改了一个属性
; l( M7 F; q; u. v+ o4 R
* S+ F1 Z6 o+ k/ W! Z% Z. l! q  TcpUtils.SendBufferLength = 1K,2K,4K,8K& `7 E  Y5 ]4 R* f/ e; k7 K+ N
0 r+ k6 m% f- x$ C# r3 {4 l  }. g$ c, d
  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.; ]- K$ E5 L; U' V* L
湖盟云防火墙. ~* X, @- @3 I
; w0 ^# c# q* d& C  _
回复

使用道具 举报

夜已深 发表于 2026-03-13 13:24:56 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-3-14 02:55 , Processed in 0.067738 second(s), 26 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表