[转]IP_ADD_MEMBERSHIP : 组播错误 的解决方法:
http://www.cnitblog.com/dvb-dvb/archive/2012/10/15/aa.html
by default live library includes winsock.h through windows.h instead of winsock2.h, but requires Winsock 2 in initializeWinsockIfNecessary(...) function.
IP_ADD_MEMBERSHIP value for Winsock1 is 5, and for Winsock 2 is 12.
Therefore socketJoinGroup(...) function is trying to call setsockopt(IP_ADD_MEMBERSHIP) from Winsock 2 with optname from Winsock 1.
There is the confusion between Winsock versions.
live555的 组播的code如下 :
testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary
Port testPort(15947); // ditto
sock = setupDatagramSocket(env, testPort);
if (sock < 0) break;
if (!socketJoinGroup(env, sock, testAddr.s_addr))
{
env<<"Failed to socket Join Group\n";
break;
}
结果:
if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(const char*)&imr, sizeof (struct ip_mreq)) < 0) {
一直失败:错误提示为: 10042:
修改为: if (setsockopt(socket, IPPROTO_IP, 12,
(const char*)&imr, sizeof (struct ip_mreq)) < 0) {
因为不同的socket版本,定义IP_ADD_MEMBERSHIP 的值不同:
in socket ver1.0中:
#define IP_ADD_MEMBERSHIP 5
in socket ver2.0中:
#define IP_ADD_MEMBERSHIP 12
本文详细解析了在使用live555库进行组播时遇到的组播错误,该错误源于默认链接的Winsock版本与所需版本不一致。文章提供了具体的解决方案,即修改setsockopt函数中IP_ADD_MEMBERSHIP的值,以匹配正确的Winsock版本。

4595

被折叠的 条评论
为什么被折叠?



