免费注册 查看新帖 |

Chinaunix

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

UDP多播问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-08 15:05 |只看该作者 |倒序浏览
/*******begin of file multi_send.c********/
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>

#define MYPORT 20000
#define MYPORT1 20002
#define BUFFSIZE 128

int sendmessage_m(int nsock, char *message, int len);
int recvmessage_m(int nsock, char *message);

int main(int argc,char *argv[])
{
        int sockfd;
        char m_ttl = 16;
        int sock_reuse = 1;
        char sd_msg[BUFFSIZE], rc_msg[BUFFSIZE];
        struct sockaddr_in sender_addr;
        //struct in_addr addr1;
        struct sockaddr_in addr1;
        struct ip_mreq multicast;
        unsigned long addr = htonl(INADDR_ANY);

        if (argc != 2)
        {
                printf("useage <multicast ip>\n";
                exit(1);
        }

        sender_addr.sin_family = AF_INET;
        sender_addr.sin_port = htons(MYPORT1);
        sender_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        multicast.imr_multiaddr.s_addr = inet_addr(argv[1]);
       multicast.imr_interface.s_addr = htonl(INADDR_ANY);

        if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
                printf("sender:new socket error!\n";
                exit(1);
        }

        if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&sock_reuse,sizeof(sock_reuse)) < 0)
        {
                perror("server : socket options set error";
                exit(1);
        }

        if (bind(sockfd, (struct sockaddr *)&sender_addr, sizeof(sender_addr)) < 0)
        {
                close(sockfd);
                perror("server : socket bind error";
                exit(1);
        }
        if (setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_TTL,(char *)&m_ttl, sizeof(m_ttl)) < 0)
        {
                perror("TTL:";
                printf("sender:set ip_multicast_ttl error!\n";
                exit(1);
        }

/**
        addr1.sin_family = AF_INET;
        addr1.sin_port = htons(MYPORT);
        addr1.sin_addr.s_addr = htonl(INADDR_ANY);
        if (setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,(char *)&addr1,sizeof(addr1)) < 0)
        {
                perror("MULTICAST_IF";
                printf("sender:set ip_multicast_if error!\n";
                exit(1);
        }
*/

        if (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&multicast,sizeof(multicast)) < 0)
       {
                printf("sender:add_membership error!\n";
                exit(1);
        }

        printf("sender has multicasted %s on port 20000!\n",argv[1]);
        strcpy(sd_msg,"Hello World!";
        if (sendmessage_m(sockfd,sd_msg,strlen(sd_msg)) < 0)
        {
                close(sockfd);
                printf("sender:send message error!\n");
                exit(1);
        }

/**
        if (recvmessage_m(sockfd, rc_msg) < 0)
        {
                close(sockfd);
                printf("recver:receive message error!\n");
        }
*/
        close(sockfd);
        return 0;

}

int sendmessage_m(int nsock,char *message,int len)
{
        struct sockaddr_in client_addr;
        client_addr.sin_family = AF_INET;
        client_addr.sin_port = htons(MYPORT);
        client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        message[strlen(message)] = 0;

        if (sendto(nsock, message, len, 0, (struct sockaddr *)&client_addr, size
of(struct sockaddr)) < 0)
        {
                return -1;
        }

        printf("sender send message: %s\n",message);
        return 0;
}

int recvmessage_m(int nsock, char *message)
{
        int n,source_len;
        struct sockaddr_in source_addr;
        if((n = recvfrom(nsock,message,BUFFSIZE,0,(struct sockaddr *)&source_add
r,(socklen_t *)&source_len)) < 0)
        {
                return -1;
        }
        message[n] = 0;
        printf("recver receive message: %s ",message);
        return 0;
}

/*****end of file multi_send.c*****/


/*****begin of file muli_recv.c*****/
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <fcntl.h>


#define MYPORT 20000
#define BUFFSIZE 128

int recvmessage_m(int nsock,char *message);
int main(int argc,char *argv[])
{
        int sockfd;
        int sock_reuse = 1;
        char rc_msg[BUFFSIZE];
        struct ip_mreq multicast;
        struct sockaddr_in recver_addr;

        if (argc != 2)
        {
                printf("useage <multicast ip>\n");
                exit(1);
        }

        multicast.imr_multiaddr.s_addr = inet_addr(argv[1]);
        multicast.imr_interface.s_addr = htonl(INADDR_ANY);
        recver_addr.sin_family = AF_INET;
        recver_addr.sin_port = htons(MYPORT);
        recver_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        bzero(&(recver_addr.sin_zero),;

        if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0)) < 0)
        {
                printf("recver:new a socket error!\n");
                exit(1);
        }

        if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&sock_reuse,sizeof
(sock_reuse)) < 0)
        {
                perror("server : socket options set error");
                exit(1);
        }

        if (bind(sockfd,(struct sockaddr *)&recver_addr,sizeof(recver_addr)) < 0
)
        {
                close(sockfd);
                printf("recver:bind socket error!\n");
                exit(1);
        }

        if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,(char *)&multicast,
sizeof(multicast)) <0)
        {
                printf("recver:add_membership error!\n");
                exit(1);
        }

        printf("recver has joined %s listen on 20000\n",argv[1]);
        if (recvmessage_m(sockfd, rc_msg) < 0)
        {
                close(sockfd);
                printf("recver:recvive message error!\n");
                exit(1);
        }
        return 0;
}

int recvmessage_m(int nsock, char *message)
{
        int n,source_len;
        struct sockaddr_in source_addr;

        if ((n = recvfrom(nsock, message, BUFFSIZE, 0, (struct sockaddr *)&sourc
e_addr, (socklen_t *)&source_len)) < 0)
        {
                return -1;
        }
        message[n] = 0;
        printf("recver receive message %s\n",message);
        return 0;
}

/*******end of file multi_recv.c******/

论坛徽章:
0
2 [报告]
发表于 2009-04-08 15:07 |只看该作者
我使用上述程序,环境在AIX5.3上,使用组播方式,结果在本机副本,可以收到,但是在其他同网段服务器上就收不到,请问,是程序有问题,还是服务器需要进行配置?请大家帮我看看

论坛徽章:
0
3 [报告]
发表于 2009-04-08 16:44 |只看该作者
大家看来用UDP的人不多呀

论坛徽章:
0
4 [报告]
发表于 2009-04-08 17:04 |只看该作者

回复 #2 dididimeme 的帖子

send不对吧?
int sendmessage_m(int nsock,char *message,int len)
{
         client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//应该往组播组里发吧。你这起不只能发给本机?应该是multicast.imr_multiaddr.s_addr = inet_addr(argv[1]);这个吧
}
小弟看法,如果上面说的楼主大大认为原本的没有问题,看看组播路由有没有设置好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP