Rx缓冲Winsock Socket编程C++。如何清除RX缓冲区?
问题描述:
我正在接收连续的视频流,我必须解码并显示它。 相机每秒发送大约20k个数据包(1288字节)。我正在流到10秒钟,摄像机停止传输流。我认为这是由于缓冲区。我正试图通过此代码清除我的缓冲区:Rx缓冲Winsock Socket编程C++。如何清除RX缓冲区?
long a = 9965535;
if (setsockopt(camm, SOL_SOCKET, SO_RCVBUF, (const char*)&a, sizeof(long)) == -1) {
fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
}
do{
Siz = recvfrom(camm, message, 1300, 0, (struct sockaddr *) &cam, &caml);
image(message, Siz);
aab++;
if (aab > 1000){
// memset((char *)&ap, 0, 65535);// &ap, 65535
//ap = "1288";
// memset(&a, 0, 9965535);
// *loc = 9965535;
// memset(loc, 0, 9965535);
aab = 0;
}
} while (Siz > 0);
任何人都可以帮我解决这个问题吗?
其实我不希望完整的帧被解码。我只需要解码可用的帧。意味着丢弃无法处理的剩余帧。
答
唯一的方法是从套接字实际读取。您可能会考虑在专用线程中执行读取操作,并且只有在缓冲区为空时才将视频帧存储在内存缓冲区中,同时丢弃其他帧。另一个线程可以根据需要按自己的时间读取和清除内存缓冲区。
+1
程序一直在正常工作,这是相机问题,相机需要一点高的连续流。谢谢你们的帮助。 –
您的循环不正确。它应该是'while((Siz = recvfrom(...))> 0)'。否则,即使在数据流结束时也要处理数据。 – EJP
我做到了,感谢您注意到这个 –