Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查缓冲区中的jpeg图像是否未被截断?_C++_Validation_Jpeg - Fatal编程技术网

C++ 如何检查缓冲区中的jpeg图像是否未被截断?

C++ 如何检查缓冲区中的jpeg图像是否未被截断?,c++,validation,jpeg,C++,Validation,Jpeg,视频监控系统由三部分组成: 客户端拖缆(c++)->服务器(c++)->客户端管理器(浏览器/js/websockets) 拖缆将jpeg帧从网络摄像头发送到服务器,服务器将此帧存储在此拖缆的std::string缓冲区中(mapStreamers->Streamers[ID]。摄像头)。当主管查询某个代理的流时,服务器将编码的拖缆[ID].Camera作为二进制文件发送给他(根据websocket standart)。结果图像在浏览器中闪烁!我认为服务器会用一个与代理的发布请求同时写入的帧进行

视频监控系统由三部分组成:

客户端拖缆(c++)->服务器(c++)->客户端管理器(浏览器/js/websockets)

拖缆将jpeg帧从网络摄像头发送到服务器,服务器将此帧存储在此拖缆的
std::string
缓冲区中(
mapStreamers
->
Streamers[ID]。摄像头
)。当主管查询某个代理的流时,服务器将编码的
拖缆[ID].Camera
作为二进制文件发送给他(根据websocket standart)。结果图像在浏览器中闪烁!我认为服务器会用一个与代理的发布请求同时写入的帧进行响应,并且这个帧会发送给管理员。以下是一个屏幕截图: 若要断开客户端连接,服务器将向主管发送最后一帧,并且最后一帧总是满的。这意味着发送和接收没有问题。我几乎可以肯定,问题在于从两个线程同时访问一个变量

所以我想在将帧发送给主管之前,在服务器上添加一些帧检查。比如:

while(!FrameIsFull(CameraFrame)){
    Sleep(1);
}
SendAllData(Socket, websocket_encode(CameraFrame));
在这个
bool FrameIsFull(string jpeg_frame)
中我应该做什么


另外,FireFox经常在控制台中写到“图像已损坏或被截断”,并且只显示帧的一部分。它是如何检查映像的?

您确定您不仅仅是做了网络I/O错误吗?您是否希望通过一个
write
/
send
调用来保证您提供的所有字节的交付?情况未必如此。显示您的。否,发送和接收是在自定义SendAll RecvAll函数中进行的。我在传入的帧上做了一个磁盘写入测试-它总是满的磁盘和网络是两件完全不同的事情,仅仅测试它并不意味着它在所有情况下都是正确的。我们应该看到这个
SendAll
函数。我理解,这就是为什么我在收到图像后在服务器上执行此测试的原因。您可以在屏幕截图中看到,发送方并没有被截断的帧,服务器只有在接收到所有帧后才将数据写入变量。在那之后,我在磁盘上看到一个测试映像,你不需要这样做。如果使用得当,TCP可以保证交付。目前,您似乎没有正确地使用它,但拒绝显示可能有问题的代码。因此,我不能再进一步了。