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

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

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况  [! c5 S+ d* M5 P' T% C
2 ?5 w4 p* L/ G' |
  测试内容描述:
9 L$ u* e4 c, |, Y
  _( o; N$ {$ h  U  每个文件块信息包大概是120k左右
( H( y: H+ h$ p6 i2 g# \" ^- D
2 t3 K& ~) U' M* T  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K
# N( h' r4 ^( m+ M9 I; F4 Q% @
# V9 S% y- {. l$ e  测试服务器分别有:
5 @% Y2 R+ d' P; T: q
4 B9 w; ~- V6 c, z  O- D  局域网:ServerA
/ `8 J$ b) S5 w3 r% h; k; n! Z- Y: g/ ^6 U3 O
  在美国机房:ServerB 延时高,Ping有时会超时1 ?) V" T& e5 J1 Y$ K, F
5 E% I$ V( f3 ~' h) F- z  f: K
  测试client一台,通过ADSL上网.4 c( P- |9 b! s+ c9 J; s

" M( ~; G8 f! z  d! U4 d  以下是Client从Sever下载文件的情况:/ o$ k) q9 c# f7 ~3 \9 z& H1 ^

3 K6 i8 Z' g3 K# G  服务器8K SendBuffer,客户端是8K ReceiveBuffer
0 D0 y  X( F( ?. k. j+ L( o% `' j) I) S" Q8 j6 Y0 j9 C% g" }- _. ^
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
4 s, M8 j$ S+ [/ L" x, r
7 w# M/ N" o4 d8 f  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
" u5 h. H0 ~# j$ i! q& N  Y* ^& K
  服务器4K SendBuffer,客户端8K ReceiveBuffer
, P: v7 q+ z1 j9 a0 ]0 X. D5 G% y5 u+ j& [" q. T& W% z  _; a
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确., V( y5 t8 r3 V) D* v) j

# R: k1 _0 e* d' W3 W/ A, Z  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
9 b- _4 |6 z  F( T8 J" x3 `1 D# x
  服务器2K SendBuffer,客户端8K ReceiveBuffer
5 v6 T; m2 b; ?
2 {  ]6 n7 \: T4 ^  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
! M0 l$ {3 p' [. X3 h- ?
; @$ n! J, f* G, p4 Z# }! A  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
+ p$ j8 h# W- Z( s9 c, `- s. r
3 {9 q  X8 r/ C! F  服务器1K SendBuffer,客户端8K ReceiveBuffer6 f5 o1 q/ X! }! I, w6 c, E

. u- _6 z7 Y& H9 _  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
  {( E9 f3 u( c9 |7 B; x) S+ o+ E, v3 j0 m  J
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.4 e1 m7 G, f  I+ d5 R* U

) M9 \5 D+ X- Q( f! V& y. N" b  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况. C# N2 c5 f( [9 {; U) Z
% ?9 k' v" ?2 f8 r+ N/ e3 b
  补充一下
/ {8 S1 Z" R' f5 _
7 ~5 M( E5 |% e  以上测试只修改了一个属性
: K% {# g$ ?% ?) L5 X% I1 Z
; @3 A! Q6 V- ~/ J1 u) @  TcpUtils.SendBufferLength = 1K,2K,4K,8K. ~. I& Y7 I8 O0 q
3 Z+ Z1 c% ?2 z2 q5 w  s
  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.
. k3 J/ t! h/ }7 I湖盟云防火墙" n; Q( x& B" N6 R# }

: v4 V) V7 Z3 A5 z: O+ J$ B1 A5 O
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-6-12 10:17 , Processed in 0.027125 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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