UDP接收,永远不会收到最后几个数据包

时间:2016-05-05 19:59:37

标签: java android c++ opencv udp

我正在使用C ++ UDP套接字将OpenCV Mat图像发送到Android设备(使用UDP Datagramsocket接收)。我正在将图像转换为Uchar缓冲区(Uchar的大小= 1),并通过UDP以1024块的形式发送它。

发送过程使用本地主机c ++套接字,但不使用Android Java数据报套接字。在Android设备上,我从不接收2304个数据包中的大约2200个。我知道使用UDP时总是会丢包,但是当我只用接收到的字节重建图像时,我得到了完整的图像,除了从底部开始的最后几行像素。

如果是通过网络丢包的情况,我假设丢失的数据包将分散在整个映像中,而不是最后100个数据报数据包的序列。

可能是收到的元素大小不匹配的情况吗? 有人遇到过类似的问题吗?

C ++发送:

  uchar *sendBuffer = (uchar*)malloc(imgSize*sizeof(uchar));
  int  bufferSize = imgSize*sizeof(uchar);     //Sizeof(uchar) returns 1.
  int datagramSize = 1024;

  for (int i = 0; i < bufferSize; i += datagramSize) {
        sendto(sock, sendBuffer + i, datagramSize, 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));

        usleep(1000);
    }

Java Android Receive:

// WIDTH x HEIGHT x CHANNELS:
int width = 1024;
int height = 768;
int numChannels = 3;
int totalSize = width*height*numChannels;

int datagramSize = 1024;

//DECLARE RECEIVE BUFFER:
byte[] totalBuffer = new byte[totalSize];
byte[] recBuffer = new byte[datagramSize];

int byte_rec = 0;

//CALL RECEIVE ON SOCKET:
for (int i = 0; i < totalSize; i += byte_rec) {

        //CALL RECEIVE:
        dSocket.receive(dPacket);
        byte_rec = dPacket.getLength();

        //MEMCOPY DATAGRAM INTO IMAGE BUFFER:
        //System.arraycopy(recBuffer, 0, totalBuffer, i, recSize );
        System.arraycopy(dPacket.getData(), dPacket.getOffset(), totalBuffer, i, byte_rec );

 }

0 个答案:

没有答案