找回密码
 加入怎通
查看: 543|回复: 2

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

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况, c! ~3 F2 A: Y# s* o
9 A6 x" P) S$ z5 R
  测试内容描述:
+ M9 `3 f( {6 E  B& F
3 @7 |  _3 l1 q, I  每个文件块信息包大概是120k左右& C. l3 Z2 w3 W/ k

; W. [/ o+ U. T, p6 U  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K/ U4 ^* w: y  b5 o
: q0 G) M/ L! y4 h! d; F: m! X
  测试服务器分别有:
; f3 h! S/ M  P1 b
7 U7 {7 v/ T/ v9 l* A2 [3 Z  局域网:ServerA
3 D2 d; T5 v* k( @. O
5 \2 z! j* b$ ^# Z3 j  在美国机房:ServerB 延时高,Ping有时会超时
& r. ?7 Q' f/ X) m/ }/ d0 i7 ]& S9 v4 X$ Q! f7 o0 ?; l
  测试client一台,通过ADSL上网.. d; Q3 b, x3 e
6 n; C; K5 r% }1 F& s7 K
  以下是Client从Sever下载文件的情况:
$ J1 @$ o$ |& B% f  @! y) W! ^& ]  w, B3 |3 a% b+ l+ A, Q
  服务器8K SendBuffer,客户端是8K ReceiveBuffer' ?) k6 k& V6 }' U+ |+ S. u/ s

# o8 X) D1 B* \3 O  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
: m; g4 H, b- ^$ O1 ~% F( ~, e* t2 @& \
  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
. v1 U% X$ L5 x. K4 x0 ~6 y7 `' A5 a# b. |3 Z
  服务器4K SendBuffer,客户端8K ReceiveBuffer3 f5 z2 k8 m/ v$ i* u* `
1 N( @; ?3 w2 a, ?3 X: m
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.9 E: ~2 g9 Z3 z) k* @! y- f

1 d, o5 H7 Z, R' |% d) f. x7 g  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误( H; M4 y- q2 N# S# p* _8 n# Y2 }
: T# F" U) t9 p) ~5 v
  服务器2K SendBuffer,客户端8K ReceiveBuffer
- P: B" i# P) s, S( u1 _! R9 z6 F
/ m4 }5 t; x! |2 s; l9 f  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.8 X% D1 V* A5 o3 f
2 M: z8 u8 h) s0 p" T
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误! g: o3 i( ^; v5 e$ t. K
2 ?6 {8 m$ ^8 ~. x' v  N
  服务器1K SendBuffer,客户端8K ReceiveBuffer
, f* i9 I  L+ i1 ~2 H, L# ]) U, U. d0 ^1 X0 X; Y; D
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.2 a, [' f' h) g4 v3 Y  N
1 G3 B7 \. f! z5 [: J. W/ n2 z
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误." V& f+ ^' Q' p
& O% V+ e* K: N4 N  o
  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况2 \; U! b4 b) C. i- Q

5 X% s+ v! b4 p7 v4 S) t; v  补充一下; Z" q$ D. Q' R/ N- {

$ f2 d( M: O$ p, S8 d$ c  J  以上测试只修改了一个属性
  l; l. i: k. a* [4 h% V: I0 i( b
  TcpUtils.SendBufferLength = 1K,2K,4K,8K) |% |& c2 p( H1 y

# L& x; ]; A; }1 U' ]5 M; w, M  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.1 G( z2 o. ~1 \& E1 f
湖盟云防火墙6 P7 y8 x0 C- I- c
9 X: n+ h, k0 i3 {0 c+ J
回复

使用道具 举报

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

使用道具 举报

而tvs 发表于 2026-04-28 01:40:02 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复 支持 反对

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-6-10 15:56 , Processed in 0.036452 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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