当前位置: 技术问答>linux和unix
LINUX下socket传输多张图像数据,有误,丢帧严重
来源: 互联网 发布时间:2017-04-09
本文导语: 传输一张图像已成功,传输4张图像出错,每张图像32K,服务器端每次send 1k,发送32次。 for(m=0;m 0) { n = send(clientfd, ptr, m, 0); if (n == -1) ... ptr += n; m -= n; printf("n:%dn", n); } | ...
传输一张图像已成功,传输4张图像出错,每张图像32K,服务器端每次send 1k,发送32次。
for(m=0;m 0)
{
n = send(clientfd, ptr, m, 0);
if (n == -1) ...
ptr += n;
m -= n;
printf("n:%dn", n);
}
for(m=0;m 0)
{
n = send(clientfd, ptr, m, 0);
if (n == -1) ...
ptr += n;
m -= n;
printf("n:%dn", n);
}
|
楼主,你的代码不安全.
接收部分的代码,是不能保证一次能接收到1024个或者固定个字节的.能接受多少是随机的.
因此,按照其他人的建议,修改为循环接收可以解决问题.
另外你说的会不会溢出的问题,这样回答:首先,一共接收多少个字节你是知道的,收够了,就退出循环.这样就不会溢出了.
至于说到的简单协议的问题,可以这样.发送32K图像之前,发送个头.
比如
4字节:type (你可以自己定义一个值,例如PIC_TYPE)
4字节:length (对应你的代码就是32K)
length字节:data (从这里发送图像数据)
另外,你还可以把4个图像组合成一个大包,也发一个包头
比如:
4字节:type (你可以自己定义一个值,例如PICGROUP_TYPE)
4字节:length (对应你的是4张图片+4个图片头=(4+4+32K)*4)
length字节:data (从这里发送4张图像的数据,保护头)
这样,在你的接收代码里面,读取这些包头,来决定如何处理.
可以参考一下用tcp/ip进行网际互联,随便参考一个协议.了解一下协议是要做些什么.
接收部分的代码,是不能保证一次能接收到1024个或者固定个字节的.能接受多少是随机的.
因此,按照其他人的建议,修改为循环接收可以解决问题.
另外你说的会不会溢出的问题,这样回答:首先,一共接收多少个字节你是知道的,收够了,就退出循环.这样就不会溢出了.
至于说到的简单协议的问题,可以这样.发送32K图像之前,发送个头.
比如
4字节:type (你可以自己定义一个值,例如PIC_TYPE)
4字节:length (对应你的代码就是32K)
length字节:data (从这里发送图像数据)
另外,你还可以把4个图像组合成一个大包,也发一个包头
比如:
4字节:type (你可以自己定义一个值,例如PICGROUP_TYPE)
4字节:length (对应你的是4张图片+4个图片头=(4+4+32K)*4)
length字节:data (从这里发送4张图像的数据,保护头)
这样,在你的接收代码里面,读取这些包头,来决定如何处理.
可以参考一下用tcp/ip进行网际互联,随便参考一个协议.了解一下协议是要做些什么.