C# Socket.Receive 得到的数据,都是一个或多个完整的tcp包吗?

snybzi 2014-08-25 03:34:25
使用public int Receive(byte[] buffer) 接收数据包,假如现在Socket中有3个100大小的包,而我的buffer 大小是250,那么buffer读取的数据大小,是2个包的200,还是2.5个包的250?
...全文
497 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Smellyfish 2014-08-25
  • 打赏
  • 举报
回复
来的包先放在缓冲区里,收到时候按照BUFFER的大小来收。 如果只来了一个包,然后你就receive了,那收到的就是100的。 如果来了两个包以后收,那收到的就是200的 如果来了三个包以后你才收,那就收到的是250的了。剩下的50还在缓冲区里,再收再给你 按快递来说的话,就是假如快递1天给你一个10斤的包裹,你能拿25斤 你要跑的勤快的话一天拿一次。那么每次给你的都是10斤的 如果你懒点5天后才来拿,那么就给你25斤,剩下的5斤下次再来拿。
烈火蜓蜻 2014-08-25
  • 打赏
  • 举报
回复
引用 7 楼 snybzi 的回复:
[quote=引用 3 楼 CGabriel 的回复:] [quote=引用 楼主 snybzi 的回复:] 使用public int Receive(byte[] buffer) 接收数据包,假如现在Socket中有3个100大小的包,而我的buffer 大小是250,那么buffer读取的数据大小,是2个包的200,还是2.5个包的250?
不确定,取决于网络状态。 就像你发快递,你不能确定快递公司把多少个包裹堆在一台车里面; 如果你一次发很多个包裹,也不能确定究竟是一台大车装,还是分 n 台小车装; 取决于快递公司的状态。[/quote] 我就怕我能拿30斤的包裹,快递给了我一个20斤的包,又从另外一个20斤的包里面拆出来一半给我...[/quote] 所以才会有自定义协议 如Http,SMTP等等 所以你要定义一个数据结构,这个结构要明确的指出当前的这个包的边界是多少,
xian_wwq 2014-08-25
  • 打赏
  • 举报
回复
引用 7 楼 snybzi 的回复:
[quote=引用 3 楼 CGabriel 的回复:] [quote=引用 楼主 snybzi 的回复:] 使用public int Receive(byte[] buffer) 接收数据包,假如现在Socket中有3个100大小的包,而我的buffer 大小是250,那么buffer读取的数据大小,是2个包的200,还是2.5个包的250?
不确定,取决于网络状态。 就像你发快递,你不能确定快递公司把多少个包裹堆在一台车里面; 如果你一次发很多个包裹,也不能确定究竟是一台大车装,还是分 n 台小车装; 取决于快递公司的状态。[/quote] 我就怕我能拿30斤的包裹,快递给了我一个20斤的包,又从另外一个20斤的包里面拆出来一半给我...[/quote] 有可能一次都能收完整,也可能只收了一部分, TCP是基于流的,所以必须处理粘包,也就是自定义包头,在包头内携带数据长度信息。 根据这个长度来确定接收是否完成。
snybzi 2014-08-25
  • 打赏
  • 举报
回复
引用 3 楼 CGabriel 的回复:
[quote=引用 楼主 snybzi 的回复:] 使用public int Receive(byte[] buffer) 接收数据包,假如现在Socket中有3个100大小的包,而我的buffer 大小是250,那么buffer读取的数据大小,是2个包的200,还是2.5个包的250?
不确定,取决于网络状态。 就像你发快递,你不能确定快递公司把多少个包裹堆在一台车里面; 如果你一次发很多个包裹,也不能确定究竟是一台大车装,还是分 n 台小车装; 取决于快递公司的状态。[/quote] 我就怕我能拿30斤的包裹,快递给了我一个20斤的包,又从另外一个20斤的包里面拆出来一半给我...
snybzi 2014-08-25
  • 打赏
  • 举报
回复
引用 2 楼 Linux7985 的回复:
你读取一次, 应该会是250的缓冲区全满了,如果你的Buffer够大,将会有多少数据,读多少数据。
不知道Socket缓存了多少数据,所以我们的buffer大小肯定不能这么理想化的觉得够大了
snybzi 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
如果来了3个包,你要一起读,就是读250 你可以来1个包就读一次,就不存在粘包拆包的问题了啊
来一个包读一个包,如果来第一个包的时候,我们在进行逻辑处理的这段时间,来了多个包,那么也会遇到上面的问题吧
烈火蜓蜻 2014-08-25
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
如果来了3个包,你要一起读,就是读250 你可以来1个包就读一次,就不存在粘包拆包的问题了啊
不是你这么说的, 来一个包标准的大小是1400多,粘包拆包的问题,不是这么解决的。 你发3个包的时候,如果不做特别的处理,他会等缓冲区满了再一次性发送的,感觉上是一个一个包的发。
CGabriel 2014-08-25
  • 打赏
  • 举报
回复
引用 楼主 snybzi 的回复:
使用public int Receive(byte[] buffer) 接收数据包,假如现在Socket中有3个100大小的包,而我的buffer 大小是250,那么buffer读取的数据大小,是2个包的200,还是2.5个包的250?
不确定,取决于网络状态。 就像你发快递,你不能确定快递公司把多少个包裹堆在一台车里面; 如果你一次发很多个包裹,也不能确定究竟是一台大车装,还是分 n 台小车装; 取决于快递公司的状态。
烈火蜓蜻 2014-08-25
  • 打赏
  • 举报
回复
你读取一次, 应该会是250的缓冲区全满了,如果你的Buffer够大,将会有多少数据,读多少数据。
於黾 2014-08-25
  • 打赏
  • 举报
回复
如果来了3个包,你要一起读,就是读250 你可以来1个包就读一次,就不存在粘包拆包的问题了啊

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧