免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3457 | 回复: 3
打印 上一主题 下一主题

组播编程问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-25 15:07 |只看该作者 |倒序浏览
下面代码问题是,我为套接口设置接口地址为本地IP如"192.168.123.12"的时候,收不到返回的包,但是设置为INADDR_ANY时确可以,请问这个是为什么呢?

另:请问加入组播时设定的本地接口和发送组播消息时设定的组播接口有什么区别呢.








#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

#define MUTIADDR "234.0.1.1"    //muticast address is 224.0.0.1~239.255.255.255
#define LOCALADDR "192.168.123.194"
#define MAXBUFF 256
#define MUTIPORT 5000
int main(int artc,char **argv)
{
        int sock=-1;
        struct sockaddr_in srv, recvc;
        //////////////////////////////////////
        struct ip_mreq mreq;
        int r,n;
        ////////////////////////////////////
        char buf[MAXBUFF];
        bzero(&srv,sizeof(srv));
        srv.sin_family = AF_INET;
        srv.sin_port=htons(MUTIPORT);
        inet_aton(MUTIADDR,&srv.sin_addr);
        //sock=socket(AF_INET,SOCK_DGRAM,0);
       
       
       
        ////////////////////////////////////////////////////////////////////
        struct sockaddr_in recvin;
        bzero(&recvin,sizeof(recvin));
        recvin.sin_family=AF_INET;
        recvin.sin_port=htons(MUTIPORT);
        //inet_aton(LOCALADDR,&recvin.sin_addr);
                //这个地方设置为LOCALADDR不能收到返回的消息,但设置成INADDR_ANY确可以.
        recvin.sin_addr.s_addr=htonl(INADDR_ANY);
        int rfd=socket(AF_INET,SOCK_DGRAM,0);
        bind(rfd,(struct sockaddr*)&recvin,sizeof(recvin));
//加入组
        {
                inet_aton(MUTIADDR,&mreq.imr_multiaddr);
                                //只要前面设置成INADDR_ANY,这里无论设置成什么都可以.
                mreq.imr_interface.s_addr=htonl(INADDR_ANY);
                //inet_aton(LOCALADDR,&mreq.imr_interface);
                setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
                //unsigned char loop = 0;
                //setsockopt(rfd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
        ///////////////////////////////////////////////////////////////////
        }
       
       
       
       
        while(fgets(buf,MAXBUFF,stdin))
        {
                if(sendto(rfd,buf,strlen(buf),0,(struct sockaddr*)&srv,sizeof(srv))<0)
                {
                        perror("sendto");
                }
                else
                {
                        fprintf(stdout,"ENVIADO A %s:%s",MUTIADDR,buf);
                }
                if((r=recvfrom(rfd,buf,MAXBUFF,0,NULL,NULL))>0)
                {
                        buf[r]=0;
                        fprintf(stdout,"in message %s",buf);
                        printf("recv ok\n");
                }
                else
                {
                        printf("recv error!\n");
                }
        }
}

[ 本帖最后由 idiotqxf 于 2007-1-25 15:22 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-25 17:35 |只看该作者
返回的包好像是从环回接口提送回去的

论坛徽章:
0
3 [报告]
发表于 2007-01-26 13:41 |只看该作者
你是说返回的包从127.0.0.1进来?

论坛徽章:
0
4 [报告]
发表于 2007-01-26 13:45 |只看该作者
不过也不行啊,我在另外一台机子上运行一个程序接收这个组发出的消息,也收不到的啊.设置成INADDR_ANY就都可以收到,或者我干脆绑定组地址都可以收到的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP