1.mystery引入

 

   1)本学期学了计算机网络,对一些网络底层的东西还是不大了解
   2)目前IP网络流行3种通信模式,分别是单播/广播与组播
   3)根据Internet关于IP地址的规定,IP地址分为A/B/C/D/E共5类
   4)A到C类地址是目前广泛应用的普通IP地址,E类地址保留为将来使用,D类地址即为组播地址,其网络号为固定的1110(前4位)
   5)若在加入一个组播组,需要利用IP_ADD_MEMBERSHIP,其中最重要的数据结构是struct ip_mreq
   6)IP_DROP_MEMBERSHIP 该选项用来从某个组播中退出
   7)服务器端:主要功能是通过指定一个多播地址,创建一个多播组
   8)客户端:主要功能是通过指定多播地址,加入多播组,在程序结束时,退出多播组
   9)调用setsockopt()函数,设置OP_DROP_MUMBERSHIP属性来退出一个多播。


2.实例操作

1)服务器端:

//multisocketserver.c
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int server_socket;
struct sockaddr_in address; server_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (server_socket < 0)
{
perror("socket");
return 0;
} memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("224.0.0.1");
address.sin_port = htons(5555); while(1)
{
char buf[200];
printf("input your word:>");
scanf("%s",buf);
if(sendto(server_socket, buf,sizeof(buf), 0,(struct sockaddr *)&address, sizeof(address)) < 0)
{
perror("sendto");
return ;
}
}
}
2)客户端:

//mutisocketclient.c
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
struct ip_mreq multiaddress;
int serveraddress_len;
int client_socket;
struct sockaddr_in serveraddress;
/*bzero(&serveraddress, sizeof(serveraddress));*/
memset(&serveraddress, 0, sizeof(serveraddress));
serveraddress.sin_family = AF_INET;
serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddress.sin_port = htons(5555);
if((client_socket = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
return 0;
}
int opt = 1;
if(setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR,&opt, sizeof(opt)) < 0)
{
perror("setsockopt:SO_REUSEADDR");
return 0;
}
if(bind(client_socket, (struct sockaddr *)&serveraddress, sizeof(serveraddress)) < 0)
{
perror("bind");
return 0;
} // 在同一个主机上进行广播设置套接口
multiaddress.imr_multiaddr.s_addr = inet_addr("224.0.0.1");
multiaddress.imr_interface.s_addr = htonl(INADDR_ANY);
//加入广播组
if (setsockopt(client_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&multiaddress, sizeof(multiaddress)) < 0)
{
perror("IP_ADD_MEMBERSHIP");
return 0;
} while(1)
{
char buf[200];
serveraddress_len = sizeof(serveraddress);
if(recvfrom(client_socket, buf, 200, 0,(struct sockaddr *)&serveraddress, &serveraddress_len) < 0)
{
perror("recvfrom");
}
printf("msg from server: %s\n", buf); if(strcmp(buf,"quit") == 0)
{
if(setsockopt(client_socket, IPPROTO_IP, IP_DROP_MEMBERSHIP,&multiaddress, sizeof(multiaddress)) < 0)
{
perror("setsockopt:IP_DROP_MEMBERSHIP");
}
close(client_socket);
return 0;
}
}
}


3.mystery注解

1)效果图

2)由上图可见,程序依然没有达到目的,在组播组内的成员依然没有收到组播消息
   3)查看源代码并没有找到相应的错误,纠结
   4)多播底层实现如源代码所示,类似于QQ里面的群消息

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1155123

【Socket】linux组播技术的更多相关文章

  1. IP组播技术介绍及实现例子

    引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...

  2. 调皮的udp组播技术

    2017年本科毕业,经历过千辛万苦的找工作之后,我进入了现在的这家公司.虽是职场小白,但励志成为IT界的一股清流(毕竟开发的妹子少,哈哈).因为公司的业务需要,我负责的部分是利用组播技术实现OSG模型 ...

  3. IP组播技术

      1  概述 1.1  产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...

  4. HCNP Routing&Switching之组播技术-组播基础

    组播技术背景 随着internet网络的不断发展,网络中交互的各种数据.语音.视频信息数量突增:新型的在线直播.网络电视.视频会议等应用也在逐渐兴起:这些业务大多符合点到多点的模式,对信息安全性.传播 ...

  5. HCNP Routing&Switching之组播技术-组播地址

    前文我们聊到了组播技术背景,单播.广播在点到多点应用中的问题,以及组播对比单播.广播在点到多点的网络环境中的优势.劣势,相关回顾请参考https://www.cnblogs.com/qiuhom-18 ...

  6. HCNP Routing&Switching之组播技术-组播协议IGMP

    前文我们了解了组播地址相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15616740.html:今天我们来聊一聊组播协议中IGMP协议相关话题: 组播 ...

  7. HCNP Routing&Switching之组播技术-组播分发

    前文我们了解了组播技术中的igmp-snooping相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15860484.html:今天我们来聊一聊组播技术 ...

  8. HCNP Routing&Switching之组播技术-组播路由协议PIM

    前文我们了解了组播技术中组播分发树相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16019334.html:今天我们来聊一聊组播路由协议PIM相关话题 ...

  9. HCNP Routing&Switching之组播技术PIM-SM RP

    前文我们了解了组播技术中,组播路由协议PIM的稀疏模式相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16142795.html:今天我们来聊一聊组播路 ...

随机推荐

  1. 利用LD_PRELOAD hook代码

    loader在进行动态链接的时候,会将有相同符号名的符号覆盖成LD_PRELOAD指定的so文件中的符号.换句话说,可以用我们自己的so库中的函数替换原来库里有的函数,从而达到hook的目的.这和Wi ...

  2. SaltStack入门到精通第一篇:安装SaltStack

    SaltStack入门到精通第一篇:安装SaltStack 作者:纳米龙  发布日期:2014-06-09 17:50:36   实际环境的设定: 系统环境: centos6 或centos5 实验机 ...

  3. bat批处理,实现获取目录

    @echo off echo 当前盘符:%~d0  echo 当前盘符和路径:%~dp0  echo 当前批处理全路径:%~f0  echo 当前盘符和路径的短文件名格式:%~sdp0  echo 当 ...

  4. linux 监控性能学习笔记(1)

    top命令中的 load average后面的三个数字分别表示距离现在一分钟,五分钟,十五分钟的负载情况. 在单核系统中100%利用负载标识为1.00,双核系统标识2.00 四核系统标识为4.00 因 ...

  5. Oracle - 层次查询

    如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...

  6. openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)

    openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...

  7. android studio 如何让包名展开

    通常我们新建一个包名的时候,会发现他们连在一起,根本无法在创建一个同级的包 工具/原料   电脑,android studio 方法/步骤     1,我们先在包名下建一个包,变成了这样,根本无法在同 ...

  8. mfc怎么显示jpg png图像

    如果是VS2005以上版本可以直接使用MFC自带的CImage类,如果不是可以用网上比较流行的CxImage,或者使用GDI+

  9. Oracle 客户端连接时报ORA-01019错误总结

    在.net+oracle开发中,发布web程序的时候,有是会遇到该错误 ora-01019 ORA-01019 unable to allocate memory in the user sideCa ...

  10. SpringApplication初始化

    SpringApplication: private void initialize(Object[] sources) { if (sources != null && source ...