当前位置: 技术问答>linux和unix
linux socket 如何接受多帧图像数据
来源: 互联网 发布时间:2016-12-06
本文导语: 最近在做毕设,在开发板端已经能够采集到JPEG视频数据,请问如何在PC客户端接受数据呢呢? 客户端采用int recv( SOCKET s, char FAR *buf, int len, int flags ); 我采集到的图片大概32K,recv可...
最近在做毕设,在开发板端已经能够采集到JPEG视频数据,请问如何在PC客户端接受数据呢呢?
客户端采用int recv( SOCKET s, char FAR *buf, int len, int flags ); 我采集到的图片大概32K,recv可以一次性全部接收吗?如果发送20帧,那么接受buf该如何定义?
客户端采用int recv( SOCKET s, char FAR *buf, int len, int flags ); 我采集到的图片大概32K,recv可以一次性全部接收吗?如果发送20帧,那么接受buf该如何定义?
|
这个。。
怎么接收得看你怎么发送,
recv是读取系统的缓冲区,这个缓冲区由内核来维护,当收到数据的时候内核会把数据追加到缓冲区中,读取之后清除。当然是可以一次读32K的,但是一般不建议一次读这么大数据量,因为读的数据越多越不容易知道错误什么时候发生,不能快速反应。
一般的做法是每次读4K左右然后自己缓存数据。
个人经验:传输一个有意义的大块数据时需要在传输时标明开始和结束,这样才能知道是否接收是一个完整的数据,如果不完整那么就说明这次会话基本上已经无法复原,就应当重新连接了。
怎么接收得看你怎么发送,
recv是读取系统的缓冲区,这个缓冲区由内核来维护,当收到数据的时候内核会把数据追加到缓冲区中,读取之后清除。当然是可以一次读32K的,但是一般不建议一次读这么大数据量,因为读的数据越多越不容易知道错误什么时候发生,不能快速反应。
一般的做法是每次读4K左右然后自己缓存数据。
个人经验:传输一个有意义的大块数据时需要在传输时标明开始和结束,这样才能知道是否接收是一个完整的数据,如果不完整那么就说明这次会话基本上已经无法复原,就应当重新连接了。
|
采用tcp协议,你的buf是一针图片,有确定的长度,要想提高可靠性,做一个简单的校验,自定义一个简单协议:数据头(自定义)+ 一针图片数据 + 数据长度校验 + 数据尾(自定义),然后在客服端解析出来,如果数据的校验不对则要服务器端重发