LINUX下socket传输多张图像数据,有误,丢帧严重

daisyzone 2011-06-22 09:43:30
加精
传输一张图像已成功,传输4张图像出错,每张图像32K,服务器端每次send 1k,发送32次。
for(m=0;m<num;m+=1024) //传输jpg图像数据
{
n=send(clientfd,buff+m,1024,0);
if(n==-1) perror("send error");
printf("n:%d\n",n);
}
客户端每次recv 1K,接收32次。
for(m=0;m<MAXDATA;m+=1024)
{
n=recv(sockfd,buff+m,1024,0);
if(n==-1) perror("recv fail\n");
printf("n:%d\n",n);
}

服务器端可以发送出去数据,只能发送3帧,发送到第4帧,出错:send error: Connection reset by peer

客户端接收到的数据不全,有丢失。而且只能接收一帧,图像很模糊不清。
...全文
2439 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
choysir 2013-05-02
  • 打赏
  • 举报
回复
楼主自己定一个封包协议
okbaozhen 2012-01-08
  • 打赏
  • 举报
回复
云里雾里中
LEIDEYANSE 2011-06-28
  • 打赏
  • 举报
回复
学习学习
heke_ken 2011-06-28
  • 打赏
  • 举报
回复
这个发送太简单了,没有一点异常处理,不错才怪
daisyzone 2011-06-28
  • 打赏
  • 举报
回复
可以接收到多张图像了!谢谢大家的回复!
liubing_2010 2011-06-28
  • 打赏
  • 举报
回复
TCP编程确实是挺有技巧的。
贾囧雷 2011-06-28
  • 打赏
  • 举报
回复
首先send不一定能send出你想发出的数据量,其次接收也不一定能接收到你想接收的数据量,
不匹配肯定完蛋
MA_XILAI 2011-06-27
  • 打赏
  • 举报
回复
楼主,你的代码不安全.
接收部分的代码,是不能保证一次能接收到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进行网际互联,随便参考一个协议.了解一下协议是要做些什么.
XNightSky 2011-06-27
  • 打赏
  • 举报
回复
路过,学习
daisyzone 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 rmax 的回复:]
楼主,你的代码不安全.
接收部分的代码,是不能保证一次能接收到1024个或者固定个字节的.能接受多少是随机的.
因此,按照其他人的建议,修改为循环接收可以解决问题.
另外你说的会不会溢出的问题,这样回答:首先,一共接收多少个字节你是知道的,收够了,就退出循环.这样就不会溢出了.

至于说到的简单协议的问题,可以这样.发送32K图像之前,发送个头.
比如
4字节:type (你可以自己……
[/Quote]
谢谢你的答复!我现在打算在服务器端定义一个数据结构:
struct frame_t
{
int header;
int length;
unsigned char buff[MAXDATA];
}
其中header为发送的图片的序号,length为32768.
那么我的客户端该怎么定义呢?刚接触网络编程,很多都不了解!
liuying_1001 2011-06-27
  • 打赏
  • 举报
回复
W.Richard Stevens UNIX网络编程 这本书,书上有提到设置socket套接字缓存的大小。可能和这个有关。
meipen 2011-06-27
  • 打赏
  • 举报
回复
每次正确发送的字节数是send的返回值 下次再发应该接着已发送正确个数之后
不是你send多少 就成功发送多少 同理recv也是
wjw_scence 2011-06-27
  • 打赏
  • 举报
回复
还是自己定协议比较好,数据长度,开始位置,结束位置,当前位置,是否传送完毕等,每次收到数据后查看数据内容,这样保证传输完毕后数据大小一样。TCP每次接收到消息不定长。。。。所以还是自己定协议比较好。
pasco 2011-06-26
  • 打赏
  • 举报
回复
学习学习
daisyzone 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 gohome520 的回复:]
真相是?
感觉不像是写不出去或者收不完整的问题,毕竟,发送的数据不是很大。
[/Quote]
个人觉得是写出去了,但是没全读出来,丢数据了!
daisyzone 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 jifengwei 的回复:]
建议还是自己定义一个协议
socket很容易出现粘包,那样接收方就不能按自己想的方法来接收的
[/Quote]
这个协议到底怎么定呢?我是新手,求大侠指点下!
小曦子 2011-06-26
  • 打赏
  • 举报
回复
你最好发送一帧完之后来一个反馈,只有当服务端接收到反馈后再发送图片数据
gohome520 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 daisyzone 的回复:]

引用 42 楼 gohome520 的回复:
真相是?
感觉不像是写不出去或者收不完整的问题,毕竟,发送的数据不是很大。

个人觉得是写出去了,但是没全读出来,丢数据了!
[/Quote]
用上面大侠说的循环读写的方式保证收发成功,还是会有问题?
传4张图片每次都出现该问题吗? 传2张图片是不是不出?
和纱Kazusa 2011-06-26
  • 打赏
  • 举报
回复
学习~
#include
andydev 2011-06-25
  • 打赏
  • 举报
回复
学习下
加载更多回复(37)

23,110

社区成员

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

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