永发信息网

api socket传输图像丢包问题

答案:2  悬赏:60  手机版
解决时间 2021-01-30 18:38
  • 提问者网友:欲望失宠
  • 2021-01-29 22:52
我需要传输图像数据,开了一个发送的线程在客户端,在服务端开了一个接受的线程。服务端接受线程代码。一开始连续传输500多张都没问题(类似于连续图像传输,像视频流),服务端收到的图像没有畸变,之后收到的图像,发生了畸变,同时,客户端和服务端都停止传输了。一丢包就停,不知道程序哪里写的不对了
如下:
接收端:线程
//IsImageBuf_Write为让主线程判断缓冲区是否在写入,防止访问冲突
//Recv_Image->imageData为申请的缓冲区域
doRecv()
{
int i=0;
int fact=0;

StartTime=GetTickCount();
//图像接收的内存缓冲准备写入,所以不能读取图像缓冲
IsImageBuf_Write=TRUE;
while(i*64 {
fact=recv(m_connect,Recv_Image->imageData+i*64,64,0);
i++;

}

if (i*64==RecvImageSize)
{
if(fact!=0)
Recv_imageNUM++;
EndTime=GetTickCount();
//图像缓冲接收图像完毕,可以读取
RecvImageBuf=Recv_Image->imageData;
IsImageBuf_Write=FALSE;
}
}

发送端:线程

do_Send()
{
int fact=send(m_connect,SendImageBuf,SendImageSize,0);//这里我整张图发送的,没有像接受端那样
}
最佳答案
  • 五星知识达人网友:洒脱疯子
  • 2021-01-30 00:11
接收端无法保证收到的数据大小正好是64整数倍。图片大小也无法保证正好是64的倍数。
如果连续发送的话,网络数据流里面,两幅图片的数据会紧挨着的。
按照64倍整数来接收,会导致前一副图片的数据里包含了第二幅图的部分数据。

可以这样:
发送端:先发出一个图像大小(int数据),然后再发出整张图。
接收端:先收到一个int,知道图像的大小后,再按照这个大小来接收图像数据。
全部回答
  • 1楼网友:长青诗
  • 2021-01-30 00:52
网上有mastersocket 这个就是纯api的,不过我用过不好用, 最后还是用的winsock 我从来没有出现过丢包现像或是其它错误 我还实现了二进制上传,也没有问题 因为ms既然发布它,就说明它是经过调试的,说错与不足,只能说是那个人不会用,或没有了解 如果学过c c++ 之类的人就不会这么说winsock不好 因为他们知道,封装与继承 就像一块视频芯片,原厂已经把相关的程序编写到这块芯片里,并出售 这叫封装, 那么电视工厂的工程师就不用去管它这个芯片是如何实现解码的。他只要知道这个如何使用,并如何设计让它在电路中工作最佳,这就是继承了解码芯片 如果工程师发现画面较差,有麻点,那么他首先要找的是电路设计的问题,而不是这块芯片的问题。。 如果他说这个芯片不好使要换另一种,那叫逃避困难。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯