none
socket 如何加入组播? RRS feed

  • 常规讨论

  • SOCKET sock;
    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (INVALID_SOCKET == sock ) 
    return;

    struct ip_mreq mreq;
    sockaddr_in addrto;
    memset(&addrto,0,sizeof(addrto));
    addrto.sin_family = AF_INET;
    addrto.sin_addr.s_addr = inet_addr("224.1.2.4"); 
    addrto.sin_port = htons(6003);

    mreq.imr_multiaddr = addrto.sin_addr;
    mreq.imr_interface.s_addr = INADDR_ANY;  
    int e = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
    e = errno;
    closesocket(sock);
    WSACleanup();
    我是一新手, 现在学如何写组播的应用, 上面的代码是想加入组播, 但是setsockopt函数总是返回 -1, 不知道是什么原因, 请高手帮忙看看! 先谢谢了。

    color your life
    2010年3月3日 10:34

全部回复

  • 返回的错误码是多少?

    可以看下这篇文章http://support.microsoft.com/kb/236377

    0xBAADF00D
    2010年3月3日 14:14
    版主
  • 你好, 谢谢回复, 我犯了一个很弱智的错, 我在setsockopt之前没有bind, 所以返回错误了

    我还有个问题

    我做的 Multicast, 之前在一台路由上做试验, 运行正常。 
    后来为了不影响公司的无线网络, 公司买了一个 IGMP Snooping 的交换机,我的程序就出问题了。 

    程序在windows xp开始运行的时候正常, 但每当240秒后, 就收不到任何数据了,然而在window 7和windows vista上都运行正常, 我google上查了半天, 好像跟 IGMP query 有关, 当IGMP咨询器收不倒任何反馈, 就自动删除 组播的组。  我运行了wireshark 检测igmp数据包, 在windows xp下只看到程序初始化的时候发的 v2 membership report, 后来就再也没有了。 而再windows 7 和vista上, 就会看到比较多的v3 membership report.

    但是我不知道如何给IGMP 咨询器发送IGMP 反馈,这个需要通过程序内部设置实现的嘛, 如果是, 该怎么做呢? 

    还是说需要通过配制windows, 让windows自动维护IGMP反馈。 

    另外我还测试了一个开源应用 VLC 播放器 和 quicktime的组播功能, 在windows xp也有相同的问题。但是我们公司之前也有组播的功能在windows xp却运行很正常, 我比较了代码很久还没找到头绪, 所以很费解。 信息有点乱,希望高手给点拨一下。


    color your life
    2010年3月4日 9:27