linux中select函数的问题

commandow 2011-06-20 11:00:53
最近调试项目时,发现这么一个问题。
我用select函数监测socket的数据。如果socket来数据了,我就调用函数接收socket中的数据,并进行一系列的处理。
现在问题是这样的,正当我在对收到的数据进行处理时,socket又收到几次数据了。等我把这次数据处理完成之后,再
去读socket中的数据时,发现读到的数据并不是我们预先需要的数据!这样就造成了网络传来的数据错误。
不知道我有没有说清楚,希望大家帮忙看下这个问题,究竟是什么原因造成的?有没有什么方法可以解决这个问题?
...全文
135 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
金刚葫芦娃 2011-06-20
  • 打赏
  • 举报
回复
友情帮顶,
justkk 2011-06-20
  • 打赏
  • 举报
回复
你是说你在读socket的过程中,读多了?把下一个报文也读出来了?
流socket本身是无边界的,需要应用程序自行处理,比如根据长度来读取
wangluoqingfeng 2011-06-20
  • 打赏
  • 举报
回复
在消息处理时你可以定义一个pair,例如std::pair<int length,char* > cmdPair,使用一个线程来处理socket数据检测,并且把新数据和长度push进一个容器中,用另一个线程根据数据长度取出数据处理,这样就可以解决数据错乱问题……
commandow 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 q191201771 的回复:]

楼主莫非问的是 粘包问题 google一下找点资料
[/Quote]
谢谢提供的方向,刚看了下,应该是我碰到的问题!
就想叫yoko 2011-06-20
  • 打赏
  • 举报
回复
楼主莫非问的是 粘包问题 google一下找点资料
肥多罗 2011-06-20
  • 打赏
  • 举报
回复
嗯 在数据中带着长度
justkk 2011-06-20
  • 打赏
  • 举报
回复
发送端在发送数据同时额外发送一个长度,表示本次发送的数据的实际长度
commandow 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxflul 的回复:]

自己定好协议可以的吧
例如在数据包里面搞两个自己来当长度
[/Quote]
你的意思是 制定协议使发端每次发送的数据定长么?
肥多罗 2011-06-20
  • 打赏
  • 举报
回复
自己定好协议可以的吧
例如在数据包里面搞两个自己来当长度
commandow 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]

你是说你在读socket的过程中,读多了?把下一个报文也读出来了?
流socket本身是无边界的,需要应用程序自行处理,比如根据长度来读取
[/Quote]
是啊,但网络来的数据长度并不是定长的,我定义了socket可接收长度的上限,在发端我给的数据都小于上限,
但在收端,有时在处理数据的时候处理速度慢的时候,取到的数据长度直接就达到了上限,在我看样,这应该是收端已经接收了多次的数据。而且这样的数据是错误的。我现在就是在想如何把每次的数据分离出来,一次一次地读取并处理网络传来的数据!

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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