找回密码
 加入怎通
查看: 564|回复: 3

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

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况
. r% h0 T# H  K4 U1 q6 o8 {2 ^$ C& `' ?1 R% l  t2 A; j
  测试内容描述:
( |+ a( k1 h4 H, [/ f
* Z  H4 y" q/ A. H' T  每个文件块信息包大概是120k左右
9 s) }! G) z) Q0 N! q" h
. s3 X- O2 s" \1 q6 @/ n! O  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K9 |0 N! B8 `# j% f- N

# Q1 @5 [: N& M7 L6 v  测试服务器分别有:1 b& x- ~; q* r) q& ~
, i' w9 R+ }7 Y
  局域网:ServerA+ g. q0 I4 P7 n) X  {

( M# `4 a# ~# E0 D: _, i+ A  在美国机房:ServerB 延时高,Ping有时会超时; h6 z2 e8 w( Q9 s
6 i. v( D  T4 Q; G& n$ I% r
  测试client一台,通过ADSL上网.
. F1 A2 b, T" u+ C- c3 H
) K4 W4 e+ @0 [7 X% U2 J  以下是Client从Sever下载文件的情况:
7 h! n% v0 m/ ~2 x0 D+ z2 w0 _$ _
  服务器8K SendBuffer,客户端是8K ReceiveBuffer- [7 A( P" _/ E  _% D+ Q

3 n% s/ O5 D; `: x" U; k' P  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
: N! U5 ~, M- E( o! j$ x0 Y) W6 S0 y# E) x- }5 J, C
  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
) n" P! B. M( C& U0 N5 W% ?5 _. E' `4 Y7 b6 ~
  服务器4K SendBuffer,客户端8K ReceiveBuffer
3 i2 Z2 Y8 y# ~1 G' f* C
8 o: B! g$ }8 y, M: O  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
( i# y0 z" r+ v: @2 q) k/ F% W2 C
  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误5 @( X% [+ i7 m' z4 b4 W8 R& N

" O  p& c3 v2 d3 K' C: g' x6 `  服务器2K SendBuffer,客户端8K ReceiveBuffer, s. l: S$ h+ H( v# W3 x

; v8 I5 V+ s9 T9 ]: P* t& j- q  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确./ Q# P- A: o6 m, S5 `
1 c7 _9 Z$ ^  Z6 n/ r" V- t1 p: Q
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误: \4 Q" g+ H( A% }
% f' Z/ j$ V# P9 z/ k
  服务器1K SendBuffer,客户端8K ReceiveBuffer; @9 g, ]( V8 e  v/ ^: g+ `

6 l# R+ v( P# Y* m( V  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
, w( H; W/ Z' V1 R) n: g& p& }) e, q  Y: \4 P% o
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.( j. o9 ?) k! K7 f

- A' V4 l/ E# L. l5 Y1 x! ]  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
9 _4 C3 @% K2 |- Z- L- [' p  U7 G& X2 o; f* f6 U6 }4 {0 g
  补充一下
- J' ?8 |: {) r
9 ~! v! e; J4 V: y8 e  以上测试只修改了一个属性
: X% h* a0 Y0 c* k1 J/ G( F( L. {6 k
) s9 d- O  ?& X- v1 t, D  TcpUtils.SendBufferLength = 1K,2K,4K,8K, f; Q  I6 E4 q5 J

! ~2 g3 W$ I) w5 s% l- }  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.' J7 @2 p9 M- L, {$ v( p, M# n! [
湖盟云防火墙7 q5 ^5 ^, z" [2 Y
: G  u3 a$ E) |  b7 k, a# F1 N

暂时无法加载帖子列表

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

DAIV 发表于 2026-07-23 05:49:28 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-7-27 11:37 , Processed in 0.073943 second(s), 52 queries , Gzip On.

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

    Powered by Discuz! X3.5

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