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. UNIX网络编程学习笔记:值-结果(value-result)参数

    前言 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针.结构的长度也作为参数来传递,其传递的方式取决于结构的传递方向:从进程到内核,还是从内核到进程. 1.从进 ...

  2. 转: Linux网络编程 【8】五种I/O 模式

    五种I/O 模式:[1]        阻塞 I/O           (Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O)[2]        非阻塞 ...

  3. jquery api 常见api 效果操作例子

    addClass_removeClass_toggleClass_hasClass.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...

  4. 创建你的第一个Android PHP应用

    google的开源移动操作系统Android给智能手机市场带来了风暴.不像Apple,对想要为水果市场(Iphone App Store)提供应用软件的开发者们有着严格的指导原则以及要求,Google ...

  5. 用lambda表达式树替代反射

    本节重点不讲反射机制,而是讲lambda表达式树来替代反射中常用的获取属性和方法,来达到相同的效果但却比反射高效. 每个人都知道,用反射调用一个方法或者对属性执行SetValue和GetValue操作 ...

  6. unity,List元素第一个成员最好是string类型

    例如 List<CmyObj> m_list=new List<CmyObj>(); class CmyObj{ string m_name; int m_value; } c ...

  7. sqlzoo练习答案--SUM and COUNT

    World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...

  8. ADT离线安装教程

    安装eclipse软件.安装后点击HELP菜单,找到下面的Install New Software并点击.   之后会弹出一个对话框,然后我们点击add,接下来弹出ADD对话框,然后我们再点击arch ...

  9. 虚拟机下安装centos7方法,修改系统语言为简体中文的方法

    说明 自己装系统时一般都可以自定义选择系统语言.可是云端服务器一般都是安装好的镜像,默认系统语言为英文,对于初学者可能还会有搞不懂的计算机词汇.这里简单说一下centos7怎么修改系统语言为中文. 虚 ...

  10. 【转】CentOS下expect 安装

      Expect是在Tcl基础上创建起来的,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管理方面发挥很大的作用. spawn命令激活一个Unix程序 ...