使用DirectShow接收Winsock UDP多播

时间:2014-07-03 15:00:53

标签: c++ directshow winsock

目前我正在尝试在自己的std :: thread上的directshow过滤器内接收多播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不返回任何数据]

0 个答案:

没有答案