mat的tcp发送缓冲区出错

时间:2015-09-18 18:04:33

标签: c++ opencv tcp

我正试图通过TCP发送Mat图像。首先,Mat已经转换为uchar,然后转换为char格式。 char格式的整个图像将由大小为1024字节的缓冲区发送出缓冲区。以下是我的代码。

Mat decodeImg = imdecode(Mat(bufferFrame), 1);

uchar *transferImg = decodeImg.data;
char* charImg = (char*) transferImg;
int length = strlen(charImg);
int offset = 0;
while (true)
{
    bzero(bufferSend, BUFFER_SIZE);

    if (offset + BUFFER_SIZE <= length)
    {
        for (int i = 0; i < BUFFER_SIZE; i++)
        {
            bufferSend[i] = charImg[i + offset];
        }
        //          memcpy(charImg+offset, bufferSend,BUFFER_SIZE);
        if (send(sockfd, bufferSend, sizeof(bufferSend), 0) < 0)
        {
            printf("Send FIle Failed,total length is%d,failed offset is%d\n",
                   length,
                   offset);
            break;
        }
    }
    else
    {
        for (int i = 0; i < length - offset; i++)
        {
            bufferSend[i] = charImg[i + offset];
        }
        if (send(sockfd, bufferSend, sizeof(bufferSend), 0) < 0)
        {
            printf("Send FIle Failed,total length is%d,failed offset is%d\n",
                   length,
                   offset);
            break;
        }
        break;
    }
    offset += BUFFER_SIZE;
}

代码输出显示:发送文件失败,总长度为251035,失败偏移量为182272.

我非常感谢您的帮助。提前谢谢!

1 个答案:

答案 0 :(得分:2)

在这里拉出水晶球。这可能是OP的问题,但如果不是,这肯定是一个需要解决的问题。

Mat decodeImg = imdecode(Mat(bufferFrame), 1);
uchar *transferImg = decodeImg.data;

获取数据。如果那是你需要发送的东西,那不是一个坏主意。

char* charImg = (char*) transferImg;

从上面获取字节数组并将其视为一个字符数组。

int length = strlen(charImg);

和Boom。矩阵数据不是ascii格式化数据,而是字符串,因此不应将其视为字符串。

strlen计算数据,直到它到达一个空字符,一个数字值为0的字符,这在正常的字母数字世界中不存在,因此可以用作金丝雀值来表示一个结束串。 count是字符串中第一个空字符前的字符数。

在这种情况下,我们没有字符串。我们有一个二进制数字blob,其中任何一个都可能为0.在任何地方都可能有一个空值。可能在一开始就是对的。可能是一百个字节。在读取所有有效图像数据之后很长时间内可能没有空值。

无论如何,strlen几乎肯定会返回错误的值。字节太少而接收器无法获取所有图像数据,我不知道它的作用。该代码不适用于我们。它可能会感到不安并丢弃结果。也许它崩溃了。没有办法知道。如果信息太多,我们也不知道会发生什么。也许它会愉快地处理文件并忽略发送的额外垃圾。也许它会崩溃。

但是,当它有足够的字节时它会关闭TCP / IP连接怎么办?这使得发送者试图将一些未发送和不需要的字节写入封闭的套接字。 send将失败并将错误代码设置为套接字关闭。

解决方案:

获取正确的数据大小。

我从openCV文档中读取的内容是Mat::elemSize,它会为您提供矩阵中每个项目的大小,而Mat::size会返回Size包含行和列的对象。乘以rows * columns * elemSize,您应该有要发送的字节数。

修改

This looks to be a better way to get the size.