我有一个程序,分服务器和客户机两部分,服务器以组播的方式向某组播地址发送数据,客户端在这个组播地址上接收数据。我在单位调试时,单位是一个局域网环境,将服务器端程序和客户端程序在一台机子上运行,客户端可以接收到数据;可我在家里调试却不行,家里是小区宽带。各位大虾指点一下,家里的机子怎么无法接收本机发送的组播数据?(帮我解决问题的大虾才给分)

解决方案 »

  1.   

    cnlyk(乾坤威龙) 
    "发到那个组播地址,就从那个组播地址读呀"
    这点我还是懂的。问题是当我将服务器端和客户端安装在一台机子上时,服务器程序虽然向某组播地址(如224.0.0.5)发送数据,可是客户端程序从这个地址上读取不到数据;当我将服务器程序和客户端程序分别安装在局域网内的两台机子上时,客户端程序就能够正确读取数据。
      

  2.   


        组播建立的过程是先建一个本地的UDP套接字,再把这个加入多播组,得到一个多播组的套接字。从现象来年,问题可能出在建立本地UDP套接字的时候。按照一般书上或各种例程的写法,是使用INADDR_ANY常数,这样会程序会给这个套接字自动绑定一个本机IP,但是如果本机有多个IP,而只有一个是用于局款域网的,那么结果会怎么样呢?它绑定的不一定是你用于局域网通信的IP。
        试试写成这样 mAddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.1");  //假设你本机的局域网IP是192.168.0.1。如果这样可以了,那么解决方法就很明显了,首先遍历网卡及各网卡的IP,选择一个合适局域网IP(可以写代码自动选择),将UDP套接字绑定于此IP上,就OK了。
        如这样仍解决不了,请把部分源代码贴出来。
      

  3.   

    另外,还有一种可能性,你的代码中应该有类似下面的部分://设置多播返回(LOOKBACK)
    const int nLoopBack = 1; //禁止回馈    
    //注意上面那个,如果为1就表示本机的多播数据不反馈到本机,否则设为0,下面就是对套接字进行设置的。
    WSAIoctl(*sock,SIO_MULTIPOINT_LOOPBACK,(void *)&nLoopBack,sizeof(nLoopBack),NULL,0,&cbRet,NULL,NULL);