社区
C++ Builder
帖子详情
一个超级奇怪的问题,ClientSocket接收数据的长度与发送方的总是不一致。请高手帮忙
nescafe8
2004-10-09 02:05:22
我用ClientSocket接受另一方在linux下的socket 写的发送的数据,可是我调用Socket->ReceiveLength();
显示接受的数据长度总是大于发送方实际发送的长度。
请问高手们,这是为什么啊。
请高手们帮我分析以下,可能存在什么情况。
...全文
350
22
打赏
收藏
一个超级奇怪的问题,ClientSocket接收数据的长度与发送方的总是不一致。请高手帮忙
我用ClientSocket接受另一方在linux下的socket 写的发送的数据,可是我调用Socket->ReceiveLength(); 显示接受的数据长度总是大于发送方实际发送的长度。 请问高手们,这是为什么啊。 请高手们帮我分析以下,可能存在什么情况。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
deshun205
2004-10-20
打赏
举报
回复
我也遇到过这种情况。主要是阻塞的问题。如果发送的数据没有发出去,它就会重新发一次。
而实际这个数据的一部分又被发送出去了,所以就发了两次相同的数据。所以在发送的时候应该考虑到网络阻塞的情况。
xujunjie
2004-10-20
打赏
举报
回复
这是很常见的粘包现象,详细的讨论及解决办法可到大富翁论坛上看看:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2846666
qibo999
2004-10-19
打赏
举报
回复
关心
cchao
2004-10-10
打赏
举报
回复
写个缓冲吧
阻塞有时候也是会粘包的
cchao
2004-10-10
打赏
举报
回复
不仅会粘包
而且有时候发一次收到2次
第二次可能什么都没有
但是就是能触发onread
cchao
2004-10-10
打赏
举报
回复
不可能
非阻塞一定会粘包的
playmud
2004-10-10
打赏
举报
回复
和缓冲有很大的关系,具体的不知道你说的这个函数是如何实现的。
如果第一次发7个字节,缓冲为8个字节,如果模式设成缓冲满了才读取,那肯定长度不对了。
Lewolf
2004-10-10
打赏
举报
回复
每一个小时发送一个数据包并且每一个数据包的大小不要超过8K,是绝对可以保证数据不会粘连的,但是这样的效率就太低了,每一分钟发送一个数据包的话,在正常网络条件下,也是不会粘连的,但是在一个极端的条件下,就是网络的速度小于2400bps的时候,偶尔会粘连的。如果每秒发送一个数据包,可能在大多数互联网的条件都是不会发生太多粘连的,但是如果在100MS以内连续发送数据包的话,一般的互联网连接都是会粘连的,如果一US发送一个数据包,10M和100M的局域网同样也是会粘连的。
我通常解决的办法是在发送时打包,接收时解包,不管粘连不粘连解包都可以正确的处理。
nescafe8
2004-10-09
打赏
举报
回复
继续顶啊
nescafe8
2004-10-09
打赏
举报
回复
顶啊
nescafe8
2004-10-09
打赏
举报
回复
楼上,那怎么能保证在非阻塞模式下,他发一次我收一次呢?
Lewolf
2004-10-09
打赏
举报
回复
收和发不是一一对应的,主要是看网络的条件,而且使用阻塞模式和非阻塞模式也是可以相互通信的,收发事件决定于双方的网络条件以及网卡的繁忙程度还有Socket栈的大小及数据块的大小。
nescafe8
2004-10-09
打赏
举报
回复
那我这个长度不对到底是怎么回事呢?
pp616
2004-10-09
打赏
举报
回复
不见得。可能是发3次收到3次。可能是收到2次。或许只有一次。
数据包可能粘在一起。
nescafe8
2004-10-09
打赏
举报
回复
继续顶啊,小弟很急啊
nescafe8
2004-10-09
打赏
举报
回复
它发了8个字节,可是我收到了17个字节的数据。
我的17个字节中前8个是对的。
我还个问题,他一个发三次,是不是每发一次就会触发我的一次ClientSocketRead事件。
有没有可能我的 17个 字节是他三次一共发的字节数的总和呢?
Lewolf
2004-10-09
打赏
举报
回复
就是指的两个数据包连在一起了,所以长度变长了
playmud
2004-10-09
打赏
举报
回复
获得长度的方式不一样,长度可能不一样。
playmud
2004-10-09
打赏
举报
回复
内容对不对呢?
nescafe8
2004-10-09
打赏
举报
回复
楼上什么粘包啊?
加载更多回复(2)
Android
Socket
发送
与
接收数据
问题
:
发送
后的数据接收到
总是
粘包
先说明一下粘包的概念:
发送
时是两个单独的包、两次
发送
,但接收时两个包连在一起被一次接收到。在以前 WinCE 下
Socket
编程,确实也要处理粘包的
问题
,没想到在 Android 下也遇到了。首先想从
发送
端能否避免这样的
问题
,例如: (1) 调用强制刷数据完成
发送
的函数;(2) 设置
发送
超时。1 先试了调用 flush() 函数,但运行后现象依旧2 设置
发送
超时是 Windows 平台的做法
Socket
Receive数据一次性接收不全的
问题
Socket
Receive数据一次性接收不全的
问题
Socket
的Send,Recv的
长度
问题
一个
包没有固定
长度
,以太网限制在46-1500字节,1500就是以太网的MTU,超过这个量,TCP会为IP数据报设置偏移量进行分片传输,现在一般可允许应用层设置8k(NTFS系统)的缓冲区,8k的数据由底层分片,而应用层看来只是一次
发送
。windows的缓冲区经验值是4k。
Socket
本身分为两种,流(TCP)和数据报(UDP),你的
问题
针对这两种不同使用而结论不一...
Java
Socket
通信及常见
问题
解决
在实际应用中,还需考虑并发连接、异常处理、数据加密等更复杂的
问题
,但基本的
Socket
通信原理和解决
方
法是相通的。在
Socket
通信中,由于数据传输的特性,可能会出现粘包和拆包的
问题
。粘包指的是
发送
方
连续
发送
的多个数据包被接收
方
合并成
一个
数据包,而拆包指的是
发送
方
连续
发送
的
一个
数据包被接收
方
拆分成多个数据包。在数据包的头部添加
一个
长度
字段,表示数据包的
长度
,接收
方
根据
长度
字段来正确地分割和重组数据。
发送
方
在数据包的末尾添加特定的分隔符,接收
方
根据分隔符将接收到的数据进行分割。
方
法设置超时时间,单位为毫秒。
socket
通讯相互
发送
读取xml实例
首先了解下
socket
通讯传输数据的特点:数据在网络传输时使用的都是字节流或字符流,
Socket
也不例外,所以我们
发送
数据的时候需要转换为字节
发送
,读取的时候也是以字节为单位读取。 那么
问题
就在于
socket
通讯时,接收
方
并不知道此次数据有多长,因此无法精确地创建
一个
缓冲区(字节数组)用来接收,在不定长通讯中,通常使用的
方
式时每次默认读取8*1024
长度
的字节,若输入流中仍有数据,则再次读取,一直到输入流没有数据为止。但是如果
发送
数据过大时,
发送
方
会对数据进行分包
发送
,这种情况下或导致接收
方
判断错误,误以为
C++ Builder
13,825
社区成员
102,678
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章