TCP接受数据问题?当一次到达的数据长度大于接受设置的最大长度时怎么办?

my3g520 2012-10-01 04:21:59
加精
我的TCP服务器接受数据长度最大设置1500 接受的buffer也是1500 但是当来的网络上来的数据大于1500(也就是recv返回的长度是1500)的时候 我发现数据有丢失 这是什么原因了?

当我都设置成15000数据才没有丢失 因为这个时候没有一次性来的数据是超过15000的

还有即使我把接受数据的buffer设置的很大比如15000,接受最大长度还是1500 依然当网络上来的数据大于1500的时候会发现有数据丢失,

总之:我发现只要一次性来的数据大于最大长度就会 有丢失数据的情况

求各位大神解答疑惑 感激不尽!
...全文
8819 108 打赏 收藏 转发到动态 举报
写回复
用AI写文章
108 条回复
切换为时间正序
请发表友善的回复…
发表回复
c_huabo 2012-10-19
  • 打赏
  • 举报
回复
路过,学习!
  • 打赏
  • 举报
回复
没有看到是什么意思 太底层了 不懂
superdreamer 2012-10-16
  • 打赏
  • 举报
回复
TCP处理数据,如果发送的数据比较大,而且涉及到请求应答的方式,最好还是在前面加一个头,头描述包括数据类型,数据长度等等,这样的话,可以处理粘包的问题。在网络传输中,各个网络节点的MTU可能不一样,还有你接受主机和发送主机的速度也不一样,type-lenth-value是网络传输中永恒不变的真理。
babyheart3 2012-10-16
  • 打赏
  • 举报
回复
突然发现我好想啥都不懂。。。
liu1136725944 2012-10-15
  • 打赏
  • 举报
回复
还是看不懂
Daniel_31 2012-10-15
  • 打赏
  • 举报
回复
以前还真没考虑过
yyz_1015 2012-10-15
  • 打赏
  • 举报
回复
z真是不知道额。很无语。。。。
qq544019204 2012-10-15
  • 打赏
  • 举报
回复
学习中....
fxlonger 2012-10-14
  • 打赏
  • 举报
回复
这个受教了。。。回复一下做个标记。
bogeer 2012-10-14
  • 打赏
  • 举报
回复
学习下~~
howesen 2012-10-12
  • 打赏
  • 举报
回复
粘包、断包嘛,自己组装一下就行了,没有什么啦!
lh15011530492 2012-10-12
  • 打赏
  • 举报
回复
做 TCPSocket 楼主要知道一个关键的东西“粘包”
程序里面一定要用 “缓冲区+指令”来处理 粘包

百度下什么叫粘包吧,然后再百度下怎么处理吧。
my3g520 2012-10-12
  • 打赏
  • 举报
回复
还想问你一个问题 linux 中 keepalive 能替代心跳吗? 有人说不建议,不太可靠是吗?

[Quote=引用 51 楼 的回复:]
可以感谢下他哈,,看我们讨论了半天,说不重点。然后回复了下。

引用 36 楼 的回复:

问题应该在接收端。用epoll要注意ET和LT。
[/Quote]
zxx4587 2012-10-12
  • 打赏
  • 举报
回复
循环就可以了
oCoolSnow1 2012-10-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20060317/00/4619967.html
oCoolSnow1 2012-10-12
  • 打赏
  • 举报
回复
还有一个问题是 Window默认的接收缓冲区是8192 超过会被清空
要设置缓冲区大小
int maxsize=1024 * 64;
setsockopt(socket,SOL_SOCKET,SO_RCVBUF,(int *)&maxsize,sizeof(int));
oCoolSnow1 2012-10-12
  • 打赏
  • 举报
回复
包大的话会被路由器丢弃了 包体设置1400左右
my3g520 2012-10-12
  • 打赏
  • 举报
回复
这不仅仅是粘包的问题 ,粘包我知道处理了的

[Quote=引用 88 楼 的回复:]
做 TCPSocket 楼主要知道一个关键的东西“粘包”
程序里面一定要用 “缓冲区+指令”来处理 粘包

百度下什么叫粘包吧,然后再百度下怎么处理吧。
[/Quote]
ZCQ8911418 2012-10-12
  • 打赏
  • 举报
回复
硬件有问题
dfasri 2012-10-11
  • 打赏
  • 举报
回复
TCP不会丢数据的.

你要用1500的buffer去收, 收到之后放到另外的缓冲列表里面, 然后假如这个缓冲列表已经可以解释到完整的包了, 就取出来进行处理. 不完整的时候继续等待接收TCP的数据

TCP是流, 所以你也得要用一个流化的缓冲列表来保存所有流数据, 然后可解释的时候才进行解释.
加载更多回复(67)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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