C++ Rx缓冲区Winsock套接字编程C++;。如何清除接收缓冲区?

C++ Rx缓冲区Winsock套接字编程C++;。如何清除接收缓冲区?,c++,sockets,winsock,C++,Sockets,Winsock,我正在接收连续的视频流,我必须解码并显示它。 摄像头每秒发送约20k个数据包(1288字节)。我得到的流到大约10秒,相机停止传输流。我认为这是由于缓冲。我正试图通过以下代码清除缓冲区: long a = 9965535; if (setsockopt(camm, SOL_SOCKET, SO_RCVBUF, (const char*)&a, sizeof(long)) == -1) { fprintf(stderr, "Error setting sock

我正在接收连续的视频流,我必须解码并显示它。 摄像头每秒发送约20k个数据包(1288字节)。我得到的流到大约10秒,相机停止传输流。我认为这是由于缓冲。我正试图通过以下代码清除缓冲区:

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); 
有人能帮我解决这个问题吗


事实上,我不希望完整的帧被解码。我只需要解码可用的帧。意味着丢弃无法处理的剩余帧。

唯一的方法是实际从套接字读取。您可以考虑在专用线程中进行读取,并且只有当缓冲区为空时,才将视频帧存储在内存缓冲区中,同时丢弃其他帧。然后,另一个线程可以根据需要在自己的时间读取并清除内存缓冲区

你的循环不正确。它应该是
while((Siz=recvfrom(…)>0)
。否则,即使在流的末尾,你也在处理数据。我这样做了,感谢你注意到这个程序一直工作得很好,这是相机的问题,相机需要高一点才能连续流。谢谢你们的帮助。