UDP广播与多播

作者:legend

QQ:1327706646

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

UDP多播

  1. 同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。下面将给出一个简单的多播接受数据的例子:
    1. // 发送端
    2. #include <iostream>
    3. #include <stdio.h>
    4. #include <sys/socket.h>
    5. #include <unistd.h>
    6. #include <sys/types.h>
    7. #include <netdb.h>
    8. #include <netinet/in.h>
    9. #include <arpa/inet.h>
    10. #include <string.h>
    11. using namespace std;
    12. int main()
    13. {
    14. setvbuf(stdout, NULL, _IONBF, 0);
    15. fflush(stdout);
    16. int sock = -1;
    17. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    18. {
    19. cout<<"socket error"<<endl;
    20. return false;
    21. }
    22. const int opt = 1;
    23. //设置该套接字为广播类型,
    24. int nb = 0;
    25. nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
    26. if(nb == -1)
    27. {
    28. cout<<"set socket error..."<<endl;
    29. return false;
    30. }
    31. struct sockaddr_in addrto;
    32. bzero(&addrto, sizeof(struct sockaddr_in));
    33. addrto.sin_family=AF_INET;
    34. addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);
    35. addrto.sin_port=htons(6000);
    36. int nlen=sizeof(addrto);
    37. while(1)
    38. {
    39. sleep(1);
    40. //从广播地址发送消息
    41. char smsg[] = {"abcdef"};
    42. int ret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen);
    43. if(ret<0)
    44. {
    45. cout<<"send error...."<<ret<<endl;
    46. }
    47. else
    48. {
    49. printf("ok ");
    50. }
    51. }
    52. return 0;
    53. }
    1. // 接收端 http://blog.csdn.net/robertkun
    2. #include <iostream>
    3. #include <stdio.h>
    4. #include <sys/socket.h>
    5. #include <unistd.h>
    6. #include <sys/types.h>
    7. #include <netdb.h>
    8. #include <netinet/in.h>
    9. #include <arpa/inet.h>
    10. #include <string.h>
    11. using namespace std;
    12. int main()
    13. {
    14. setvbuf(stdout, NULL, _IONBF, 0);
    15. fflush(stdout);
    16. // 绑定地址
    17. struct sockaddr_in addrto;
    18. bzero(&addrto, sizeof(struct sockaddr_in));
    19. addrto.sin_family = AF_INET;
    20. addrto.sin_addr.s_addr = htonl(INADDR_ANY);
    21. addrto.sin_port = htons(6000);
    22. // 广播地址
    23. struct sockaddr_in from;
    24. bzero(&from, sizeof(struct sockaddr_in));
    25. from.sin_family = AF_INET;
    26. from.sin_addr.s_addr = htonl(INADDR_ANY);
    27. from.sin_port = htons(6000);
    28. int sock = -1;
    29. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    30. {
    31. cout<<"socket error"<<endl;
    32. return false;
    33. }
    34. const int opt = 1;
    35. //设置该套接字为广播类型,
    36. int nb = 0;
    37. nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
    38. if(nb == -1)
    39. {
    40. cout<<"set socket error..."<<endl;
    41. return false;
    42. }
    43. if(bind(sock,(struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)) == -1)
    44. {
    45. cout<<"bind error..."<<endl;
    46. return false;
    47. }
    48. int len = sizeof(sockaddr_in);
    49. char smsg[100] = {0};
    50. while(1)
    51. {
    52. //从广播地址接受消息
    53. int ret=recvfrom(sock, smsg, 100, 0, (struct sockaddr*)&from,(socklen_t*)&len);
    54. if(ret<=0)
    55. {
    56. cout<<"read error...."<<sock<<endl;
    57. }
    58. else
    59. {
    60. printf("%s\t", smsg);
    61. }
    62. sleep(1);
    63. }
    64. return 0;
    65. }
  2. 自已在Linux虚拟机下测试可以成功, 前提是要把主机设置在同一网段内, 还有就是不要忘记关闭Linux的防火墙.. 可以使用setup命令进行设置。

    (我在测试的时候只能发送不收接收,折磨了我半天,后来才想到是Linux防火墙的问题。。)

    关于虚拟机的网卡配置,建议选择桥接模式。NAT的模式的话,是受限制的,可能会收不到广播消息。

    具体的参考网上的文章吧。。

socket udp广播和多播的简单实现的更多相关文章

  1. UDP广播与多播

    UDP广播与多播 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去.至于服务 ...

  2. c# socket udp广播

    一.广播消息 由于Tcp是有连接的,所以不能用来发送广播消息.发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息.广播消息的目的IP地址是一种特殊IP地址,称为广播地址.广播地址由IP地址 ...

  3. udp广播和多播

    使用UDP协议进行信息的传输之前不需要建立链接, 客户端向服务器发送信息时,客户端只需要给出服务器的ip地址和端口号,可以发送信息.至于服务器端是否存在,是否能够收到该报文,客户端根本不用管. 广播( ...

  4. TCP/IP||UDP广播和多播

    1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...

  5. Netty实战十三之使用UDP广播事件

    1.UDP的基础知识 我们将会把重点放在一个无连接协议即用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据报丢失的情况下. 面向连接的传输(如TCP)管理了两个网络端点之间的连接 ...

  6. android 发送UDP广播,搜寻server建立socket链接

    应用场景:client(手机.pc)须要搜寻所在局域网内的server并获得server地址. 方法简单介绍:client发送UDP广播,服务收到广播后得到clientip地址,然后向client发送 ...

  7. UDP 单播、广播和多播

    阅读目录(Content) 一.UDP广播 二.UDP多播 1.多播(组播)的概念 2.广域网的多播 三.UDP广播与单播 广播与单播的比较 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就 ...

  8. UDP 单播、广播、多播

    一.UDP广播 广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机.值得强调的是:本地广播信息是不会被路由器转发.当然 ...

  9. udp单播,广播,多播实现(ReceiveFromAsync,SendToAsync)

    注意:客户端和服务器实现基本一致,本地host和port和多播的host和port可以一样 (1)多播 1.将本地host加入多播组中,只有加入多播组的成员才能接受同组的节点发送的多播 Multica ...

随机推荐

  1. 14.2 事务的ACID属性

    14.2 事务的ACID属性正在更新内容.请稍后

  2. react 调用项目中的 .html 文件

    (1)将 html 文件 放于 public 文件夹下 (2)window.open('about:blank').location.href="http://localhost:3000/ ...

  3. MQTT---HiveMQ源代码具体解释(四)插件载入

    源博客地址:http://blog.csdn.net/pipinet123 MQTT交流群:221405150 实现功能 将全部放在plugins文件夹下的全部符合plugin编写规范的plugin ...

  4. 转:教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

  5. AI的分支学科

    AI 的分支学科 [References]AAI(Advanced Artificial Intelligence)

  6. 数据库入门级面试题(带答案) 数据库简单面试题(带答案) MySQL面试题带答案

    数据库入门[mysql]   1.假设要按照分页(每页显示10条)的形式获取test表中的数据,在MySql数据库中,以下哪条语句是取第2页中的数据?(单选)   (难度A) A.select * f ...

  7. JEECG与帆软报表集成

    将FineReport 集成到自己的web项目中,生成报表,可以方便快捷的和自己的项目融合在一起.简化了利用poi的导出遇到的问题. 1.首先在FR中建立好一个模板      例如:我的这张模板是连接 ...

  8. unity, SkinnedMeshRenderer.bones[i]不能直接赋值

    SkinnedMeshRenderer.bones[i]=xxx,这样写不报错,但也不起作用. 正确的方法是: List<Transform> boneList=new List<T ...

  9. unity, imageEffect的最后一步blit所用的shader,应该关闭zwrite和ztest

    给项目组做了个imageEffect特效,结果导致ngui不显示(ugui则不存在此问题),看ngui的一些shader,其中ztest是开着的,而且ui相机的Clear Flags用的是Don't ...

  10. Hadoop在线分析处理(OLAP)

    数据处理与联机分析处理 ( OLAP ) 联机分析处理是那些为了支持商业智能,报表和数据挖掘与探索等业务而开展的工作.这类工作的样例有零售商按地区和季度两个维度计算门店销售额,银行按语言和月份两个维度 ...