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. linux 16进制 产看文件

    hexdump - ascii, decimal, hexadecimal, octal dump  查看十六机制的首选工具.  -c 每单元以字节为单位,显示出对应的ASCII码  -C 每单元以字 ...

  2. 怎样获取oracle dbid

    1.查询v$database获得 因为DBID在控制文件和数据文件里都存在记录,所以假设可以mount数据库就行查询v$database视图获得.  SQL> alter database mo ...

  3. 转:sock_ev——linux平台socket事件框架(uri地址的解析) .

    在第一篇中,已经说明,传递的socket地址采取以下形式: [cpp] view plaincopyprint?stream://192.168.2.10:8080   dgram://192.168 ...

  4. 【laravel54】composer install与composer update的区别

    1.基础概念: 我们需要明白laravel项目里面有2个配置文件,composer.json和composer.lock文件,前者是下载的依赖包配置文件,后者是锁定的包版本信息. 使用之前,需要cd ...

  5. 【LeetCode】113. Path Sum II

    Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...

  6. log4cpp基础测试

    // log4cplus.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #include <iostream>#include ...

  7. GuozhongCrawler系列教程 (4) StartContext具体解释

    StartContext是注入时全部seed的上下文信息假设爬虫在抓取过程其中须要共享一些变量.那么可使用StartContext作为容器. 构造器具体资料 StartContext public S ...

  8. Java Socket网络编程Server端详解

    Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...

  9. python随机数seed用法

    import random ... def main(): a = random.Random() a.seed(1) print a.random() 这样就可以通过种子取得固定随机值了 网上很多只 ...

  10. 从调试角度理解ActionContext、OgnlContext、OgnlValueStack的关系

    被调试代码:    package web; import java.util.Map; import javax.servlet.http.HttpServletRequest; import or ...