C++ 使用DirectShow接收Winsock UDP多播

C++ 使用DirectShow接收Winsock UDP多播,c++,directshow,winsock,C++,Directshow,Winsock,目前,我正在尝试在directshow筛选器自己的std::线程中接收多播UDP数据包。我创建了一个小函数,当作为控制台应用程序独立运行时,它可以成功地接收数据包。但是,将此代码插入directshow筛选器中的任何位置都会失败。目前使用pushsource作为示例起点,recvfrom返回-1,WSAGetLastError返回10060。通过使用graphstudio将过滤器放置在图形上进行测试 这是我的代码块,它创建套接字并尝试从中读取数据,这是从std::thread运行的 char*

目前,我正在尝试在directshow筛选器自己的std::线程中接收多播UDP数据包。我创建了一个小函数,当作为控制台应用程序独立运行时,它可以成功地接收数据包。但是,将此代码插入directshow筛选器中的任何位置都会失败。目前使用pushsource作为示例起点,recvfrom返回-1,WSAGetLastError返回10060。通过使用graphstudio将过滤器放置在图形上进行测试

这是我的代码块,它创建套接字并尝试从中读取数据,这是从std::thread运行的

char* multicast_ip = "239.1.2.3";
unsigned short multicast_port = atoi("3000");
SOCKADDR_IN multicast_addr;
WSADATA wsaData;
int hr;
BOOL bOptVal = TRUE;
ip_mreq mreq;
int max_length = 16;

WSAStartup(MAKEWORD(2,0), &wsaData);

SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

// construct bind structure
memset(&multicast_addr, 0, sizeof(multicast_addr));
multicast_addr.sin_family = AF_INET;
multicast_addr.sin_addr.s_addr = htonl(INADDR_ANY);
multicast_addr.sin_port = htons(multicast_port);

hr = bind(sock, (struct sockaddr *) &multicast_addr, sizeof(multicast_addr));

/* Specify the multicast group */
mreq.imr_multiaddr.s_addr = inet_addr(multicast_ip);
/* Accept multicast from any interface */
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
/* Join the multicast address */
hr = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *) &mreq, sizeof(mreq));

int optval = 8;
hr = setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL, (char*)&optval,sizeof(int));

hr = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&bOptVal, sizeof(bOptVal));

int timeout = 1000; // 1 sec
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(timeout));

while (true)
{
    char buffer[4096] = { 0 };

    int i = recvfrom(sock, buffer, 4096, 0, NULL, 0);

    int wut = WSAGetLastError();
}
WSACleanup();

有人知道为什么它可以作为一个独立的应用程序工作,但是当这个代码放在过滤器的任何地方时,它都无法接收数据吗?[由于recvfrom不返回任何数据,因此为了简洁起见,省略了实际将数据从缓冲区推送到要处理的代码]

我认为如何将此代码准确插入过滤器很重要:代码本身很好,您可以让它独立工作,DirectShow base不使用套接字,最初我只是将所有代码包装在一个函数foo中,并在输出pin的构造函数中启动一个指向foo的std::thread。我在其他地方测试了它,比如过滤器的构造函数和CreateInstance,但两者都导致了recvfrom和winsock报告错误10060返回-1的相同行为。这发生在一个新的pushsource示例项目中。有什么特别的地方我应该创建线程吗?