socket发一个较大数据,对方如何判断接收完成?

newlyj 2010-04-04 02:37:59
我在试着编一个简单的远程监控软件,原理是
服务端每隔固定的时间就截屏幕,转成jpg(1024*786大概100k左右),然后把jpg数据发
给监控端(一次send一张),监控端接收并把他画出来。

在监控端的连接CSocket的OnReceive里Receive数据。画之,但画出来的经常只是图上面的一小部分。
后来发现OnReceive是数据缓冲有值他就触发,所以每次receive都是接收10几k就画了.
最烦的就是有时缓冲里的数据有前一个图片的结尾和后一个图片的开头.不好判断一张图的结束

我现在想到的方法是服务端发送时在数据后面加段结束标识,监控端用一个全局固定数组tempData来不停接收数据,
遇到结束标识时,把tempData前面的数据画出来,并删除,把tempData后面的数据往前移。
(感觉有点麻烦,还没有实施这种方法)

如标题,想问一下各位高人,怎么判断一个较大数据被完整接收?太感谢了.
...全文
856 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaowanzi3001 2011-09-28
  • 打赏
  • 举报
回复

发送端循环发送,
接收到循环接收。
发送端定义包格式,加上本次发送数据的长度,发送完包头后,再发送你真正的数据。

“包头”是不是自己定义一个结构体,然后自己往里面填充文件名、数据长度之类的数据,然后把这个结构体当做数据发送给对方?还是填充TCP/IP数据报的头部字段?
newlyj 2010-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arong1234 的回复:]
你检查“正确长度”的方法是什么?理论上一个TCP/IP报文只有1.5K,超过这个值就值得怀疑

引用 4 楼 newlyj 的回复:
还想问下,缓冲区大小为8192,为什么我一次send40到70k的数据也能返回正确的长度,
在监控端一次接收到的长度有时有十几k,这是怎么回事?
[/Quote]

int len=send(数据,50k);
执行后len为50k;如果发送100k,这里len可能为40-60k.
arong1234 2010-04-05
  • 打赏
  • 举报
回复
你检查“正确长度”的方法是什么?理论上一个TCP/IP报文只有1.5K,超过这个值就值得怀疑[Quote=引用 4 楼 newlyj 的回复:]
还想问下,缓冲区大小为8192,为什么我一次send40到70k的数据也能返回正确的长度,
在监控端一次接收到的长度有时有十几k,这是怎么回事?
[/Quote]
newasoft 2010-04-05
  • 打赏
  • 举报
回复
直接把读的数据长度相加即可,到达文件结尾就开始画图。
newlyj 2010-04-05
  • 打赏
  • 举报
回复
还想问下,缓冲区大小为8192,为什么我一次send40到70k的数据也能返回正确的长度,
在监控端一次接收到的长度有时有十几k,这是怎么回事?
用户 昵称 2010-04-05
  • 打赏
  • 举报
回复
1)你要解决粘包的问题
2)加入自己定义的格式。
lijianli9 2010-04-05
  • 打赏
  • 举报
回复
发送端循环发送,
接收到循环接收。
发送端定义包格式,加上本次发送数据的长度,发送完包头后,再发送你真正的数据。
newlyj 2010-04-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lijianli9 的回复:]
发送端循环发送,
接收到循环接收。
发送端定义包格式,加上本次发送数据的长度,发送完包头后,再发送你真正的数据。
[/Quote]
嗯,每次循环要发送和接收的数字为多少最好最稳定呢,我每次发送接收4byte,cpu跳到了80%以上,发送接收1024时,cpu在%1左右.
我现在正在想办法处理粘包的问题。

呵呵,经过各位的指点我了解了很多,感谢阿
newlyj 2010-04-04
  • 打赏
  • 举报
回复
我之前用过这方法,在发数据之前先把数据长度发过去,然后再发数据,
但出现了很多问题,是不是我读缓冲长度的方法不对,
我用的是IOCtl(FIONREAD, &nBytes);
buptzwp 2010-04-04
  • 打赏
  • 举报
回复
你先发个数据长度,对方根据这个长度接收数据。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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