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); 

任何人都可以帮我解决这个问题吗?

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

+0

您的循环不正确。它应该是'while((Siz = recvfrom(...))> 0)'。否则,即使在数据流结束时也要处理数据。 – EJP

+0

我做到了,感谢您注意到这个 –

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

+1

程序一直在正常工作,这是相机问题,相机需要一点高的连续流。谢谢你们的帮助。 –