组播发送和组播接收的源代码例子

组播原理这里就不介绍了, 我博客里有介绍组播原理的详细的文章。

 

这里只是实现一个小例子, 一个 send.cpp 一个recv.cpp文件。

 

编译后生成2个进程, 一个接收一个发送。

 

Sender.cpp 文件内容如下:

 

 

Recver.cpp 文件内容如下:

 

 

Makefie 文件如下 :

 

 

 

编译方法直接

 

make

 

下来执行

 

./Sender 

 

./Recver

 

即可看到输出的结果。。。。

 

---------------------------------------------------------------------------------------------------

 修改过的  Recver.c   , 接收二进制数据, 接受传入参数?

    #include <stdlib.h>  
    #include <sys/types.h>  
    #include <sys/socket.h>  
    #include <netinet/in.h>  
    #include <arpa/inet.h>  
    #include <time.h>  
    #include <string.h>  
    #include <stdio.h>  
    #include <unistd.h>  
      
    //#define HELLO_PORT  12345  
    //#define HELLO_GROUP "225.0.0.37"  
    #define MSGBUFSIZE 32*1024  
      
    int main(int argc, char *argv[])  
    {  
		if (argc != 4)
		{
			printf ("%s  mulitAddr  port  bindIP\n");
			exit(129);
		}
		char* multiAddr = argv[1];
		int port = atoi(argv[2]);
		char* bindIP = argv[3];
		
		printf ("%s:%d\n", multiAddr, port);
		printf ("bindIP = %s\n", bindIP);
		
        struct sockaddr_in addr;  
        int fd, nbytes,addrlen;  
        struct ip_mreq mreq;  
        char msgbuf[MSGBUFSIZE];  
      
        u_int yes=1; /*** MODIFICATION TO ORIGINAL */  
      
        /* create what looks like an ordinary UDP socket */  
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)   
        {  
            perror("socket");  
            exit(1);  
        }  
      
      
        /**** MODIFICATION TO ORIGINAL */  
        /* allow multiple sockets to use the same PORT number */  
        if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)   
        {  
            perror("Reusing ADDR failed");  
            exit(1);  
        }  
        /*** END OF MODIFICATION TO ORIGINAL */  
      
		unsigned long nip = inet_addr (bindIP);
        /* set up destination address */  
        memset(&addr,0,sizeof(addr));  
        addr.sin_family=AF_INET;  
        addr.sin_addr.s_addr=INADDR_ANY; /* N.B.: differs from sender */  
        addr.sin_port=htons(port);  
      
        /* bind to receive address */  
        if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)  
        {  
            perror("bind");  
            exit(1);  
        }  
      
        /* use setsockopt() to request that the kernel join a multicast group */  
        mreq.imr_multiaddr.s_addr=inet_addr(multiAddr);  
        mreq.imr_interface.s_addr=inet_addr(bindIP);//htonl(INADDR_ANY);  
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)   
        {  
            perror("setsockopt");  
            exit(1);  
        }  
      
	    FILE* fp = fopen ("./xxxx.ts", "w+");
        /* now just enter a read-print loop */  
        while (1)   
        {  
            addrlen=sizeof(addr);  
            if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr,(socklen_t*)&addrlen)) < 0)   
            {  
                perror("recvfrom");  
                exit(1);  
            }  
            fwrite (msgbuf, 1, nbytes, fp);
			printf ("write data %d bytes\n", nbytes);
        }  
      
        return 0;  
    }  


  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

langeldep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值